上次在練習sklearn的KNN分類時,遇到了一些問題,了解後覺得對於資料的維度能夠理解的更加清楚,所以在這裡記錄下來。 首先先簡述一下我在做KNN的流程:
- 使用的資料集是sklearn內建的資料集進行練習
- 用
sklearn.model_selection
的train_test_split()
把資料切成training set / testing set - 使用sklearn的KNeighborsClassifier進行分類、預測
在處理過程中我遇到了兩個DataConversionWarning,分別是不同的原因造成的,以下來講一下:
- DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
在處理output(label)的array的時候我的label原本是一個(569,1),但它顯示了warning說不能用二維的array,所以要透過np.ravel()這個function將資料轉成一維的array,也就是(569,),處理完就沒warning了。
- DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.DeprecationWarning)
這個則是在predict的時候,我的input(test_feature)原本是一維的資料,所以我就用一維的array代進去了,Ex:
1 | prediction_data = np.array([20,4.3,5.5]) |
然後就產生這個warning告訴你說data input不能是一維的,要透過np.reshape(1,-1)把資料轉成二維的,轉成後會變成[[20,4.3,5.5]]。
補充一下reshape的-1代表自動計算轉換前的array個數,reshape(1,-1)是變成一條橫的array,reshape(-1,1)是變成一條直的array。
在知乎上看到一則網友對此的說明,覺得比較好理解位什麼要這樣處理input / output,我直接引用他的話:
“我觉得你对机器学习算法还是不了解的,其实是这样的: 你的输入的数据X应该是数据的特征向量,y是特征向量对应的标签。每一个样本都有一个特征向量,这样你输入的X一定是二维数组才对,y如果是单标签就为一维数组,若为多标签或者像神经元网络那样的标签就为二维数组。 你的x=[[6],[8],[10],[14],[18]],算法可以理解为只有一个特征项,但是如果为x=[6,8,10,14,18],你让算法怎么理解”
附上原網址:https://segmentfault.com/q/1010000010743191