【问题标题】:kNN Classifier - importance of DataFrame column order - is this a scikit bug, pandas bug or by design?kNN 分类器 - DataFrame 列顺序的重要性 - 这是 scikit 错误、pandas 错误还是设计使然?
【发布时间】:2016-07-05 09:15:50
【问题描述】:

我们有这个 sci-py 代码:

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier

df = pd.DataFrame({'Category':['X','X','X','X','X','X','Y','Y','Y','Y','Y']
                        ,'Age':[10,20,30,35,32,33,27,70,40,50,60]
                        ,'Weight':[15,16,21,33,7,8,9,11,31,38,25]
                        ,'Exercise':[2,0,0,1,7,6,9,11,2,0,5]})

classifier_3NN = KNeighborsClassifier(n_neighbors=3, metric='minkowski')

train_df = df[['Age','Weight','Exercise']]
target_ss = df['Category']

classifier_3NN.fit(train_df, target_ss)

test_df = pd.DataFrame({'Age':[11,27,39]
                        ,'Weight':[21,9,36]
                        ,'Exercise':[7,6,0]})

直观地说,我们希望能够按照数据帧列的任何顺序将测试数据输入分类器,并且算法将计算列标题,但我们得到以下结果:

In [21]: classifier_3NN.predict(test_df[['Age','Weight','Exercise']])

Out[21]: array(['X', 'X', 'Y'], dtype=object)

当我交换订单时:

In [22]: classifier_3NN.predict(test_df[['Exercise','Weight', 'Age']])

Out[22]: array(['X', 'X', 'X'], dtype=object)

这是设计使然还是错误?如果这是一个错误,那么错误发生在哪里 - 哪个包?如果是设计使然,那么它记录在哪里?

【问题讨论】:

  • 我不认为 sklearn 支持熊猫。它们一起工作的原因是数据帧是 numpy 数组的包装器。通过传递test_df[['Age','Weight','Exercise']]test_df[['Exercise','Weight', 'Age']],您实际上传递了两个不同的数组。在第二个中,sklearn 会将运动值作为年龄值。

标签: python pandas scikit-learn


【解决方案1】:

我认为没有错误,但我同意可以更好地记录它。您必须以正确的顺序提供数据框。

由于 scikit 在构建时考虑了 numpy,因此 Dataframe 被转换为 numpy 二维数组(这也在 fit 部分期间),并且它不保存标题顺序。

在继续算法之前检查和转换数组,通过check_array,如果dtypes没有问题,它基本上返回numpy.array(thedataframe)

这发生在utils.validation module

【讨论】:

    【解决方案2】:

    如果您再次调用.fit() 并更改标签的顺序,它会正常工作。

    SKLearn 分类器根本不跟踪标题。

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 2012-11-29
      • 2016-08-22
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 2012-10-08
      • 1970-01-01
      相关资源
      最近更新 更多