【问题标题】:Data Preprocessing for KNN in pythonpython中KNN的数据预处理
【发布时间】:2021-07-26 02:57:51
【问题描述】:

预处理要花很多时间去理解,tuple,list,float,array结构。 我的数据看起来像

<bound method NDFrame.head of                                                       X                                 Y
0     [1.9902, 1.9902, 1.9902, 1.9902, 1.9902, 0.034...      [0.097, 0.097, 0.097, 0.094]
1     [1.9902, 0.034, 0.034, 0.034, 0.034, 0.034, 0....      [0.094, 0.094, 0.094, 0.094]
2     [0.034, 0.034, 0.097, 0.097, 0.097, 0.097, 0.0...  [1.0882, 1.0882, 1.0882, 1.0882]
3     [0.097, 0.097, 0.097, 0.094, 0.094, 0.094, 0.0...  [1.0882, 1.2382, 1.2382, 1.2382]
4     [0.094, 0.094, 0.094, 0.094, 1.0882, 1.0882, 1...  [1.2382, 1.2382, 1.2182, 1.2182]
...                                                 ...                               ...
3395  [0.136, 0.286, 0.286, 0.286, 0.286, 0.286, 0.2...  [0.1276, 0.1276, 0.1276, 0.1276]
3396  [0.286, 0.286, 0.266, 0.266, 0.266, 0.266, 0.2...   [1.1423, 1.2923, 1.2723, 3.672]
3397  [0.266, 0.266, 0.266, 0.1276, 0.1276, 0.1276, ...      [3.672, 3.672, 3.772, 3.772]
3398  [0.1276, 0.1276, 0.1276, 0.1276, 1.1423, 1.292...      [3.772, 3.802, 3.802, 3.802]
3399  [1.1423, 1.2923, 1.2723, 3.672, 3.672, 3.672, ...      [1.021, 1.021, 1.021, 1.021]

我正在使用

进行数据拆分
x=csv_data['X']
y=csv_data['Y']
#print(x)
x_train, x_test, y_train, y_test = train_test_split(x,y)

拟合 KNN 模型

K = []
training = []
test = []
scores = {}
  
for k in range(2, 21):
    clf = KNeighborsClassifier(n_neighbors = k)
    clf.fit(x_train, y_train)
  
    training_score = clf.score(x_train, y_train)
    test_score = clf.score(x_test, y_test)
    K.append(k)
  
    training.append(training_score)
    test.append(test_score)
    scores[k] = [training_score, test_score]

遇到错误

TypeError                                 Traceback (most recent call last)
TypeError: float() argument must be a string or a number, not 'list'

The above exception was the direct cause of the following exception:

ValueError                                Traceback (most recent call last)
<ipython-input-93-906aa771beda> in <module>()
      6 for k in range(2, 21):
      7     clf = KNeighborsClassifier(n_neighbors = k)
----> 8     clf.fit(x_train, y_train)
      9 
     10     training_score = clf.score(x_train, y_train)

7 frames
/usr/local/lib/python3.7/dist-packages/numpy/core/_asarray.py in asarray(a, dtype, order)
     81 
     82     """
---> 83     return array(a, dtype, copy=False, order=order)
     84 
     85 

ValueError: setting an array element with a sequence.

我一直在尝试一些方法,例如 preprocessingStandardScaler dint 对我有用。 请帮助运行 KNN。 谢谢

【问题讨论】:

    标签: python dataframe data-preprocessing


    【解决方案1】:

    问题是在使用KNN 时,您的y 的形状为(n, 4),而KNN.fit 方法希望您的y 的形状为(n,1)。所以简而言之,您只能从y 中预测 1 个值。所以简而言之,对于y 中的每一列,您要么使用KNN 4 次,要么不使用KNN

    代码会是这样的

    # Import KNN for regression
    
    y1 = y.iloc[:, 0]
    y2 = y.iloc[:, 1]
    y3 = y.iloc[:, 2]
    y4 = y.iloc[:, 3]
    
    regressor1 = KNeighborsRegressor(n_neighbors=k).fit(x, y1)
    regressor2 = KNeighborsRegressor(n_neighbors=k).fit(x, y2)
    regressor3 = KNeighborsRegressor(n_neighbors=k).fit(x, y3)
    regressor4 = KNeighborsRegressor(n_neighbors=k).fit(x, y4)
    

    天啊!!现在我看到您使用KNN 进行分类,实际上您的问题是回归。你的基础真的很差。

    另外,甚至不要使用它。你不会从中得到任何好的结果,而且计算成本也很高。

    【讨论】:

    • 另外,其他方法也会出现同样的错误。我也尝试适应随机森林。当我拟合模型时出现同样的错误。
    • 每个模型都会出现该错误,因为您不能将 y 作为矩阵。
    • 好吧,你的代码没有给出任何输出。我想你没有得到我的问题。
    • @NIrbhayMathur 我不会为你编写整个代码。我给了你足够的答案来回答你的问题。其余代码与您的相同。我刚刚将您的 clf.fit(x_train, y_train) 行更改为其中的 4 个 regressor1 = KNeighborsRegressor(n_neighbors=k).fit(x, y1) 行。所以现在你只需要使用training_score1 = regressor1.score(x_train, y_train)training_score2 = regressor2.score(x_train, y_train) 等等,其余的都一样。
    猜你喜欢
    • 2018-07-28
    • 2022-12-21
    • 2019-09-12
    • 2016-08-03
    • 2019-09-21
    • 2012-05-15
    • 2013-04-30
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多