python - 这两种为 sklearn 分类器过滤 Pandas 数据帧的方法有什么区别?

标签 python pandas scikit-learn

我有与此相同的 pandas 数据框(还有更多的列,其余为数字)。

import pandas as pd
from sklearn.dummy import DummyClassifier

df = pd.DataFrame({'Time':['2013-08-01 00:00:00', '2014-09-01 12:10:00', '2015-02-02 10:10:00', '2016-01-01 00:00:00'], 'Model_Targ':['a', 'b', 'a', 'b'], 'Col2':[-0.945000, -0.855000, -0.860000, -0.945000], 'Col3':[64.384028, 64.485417, 64.609028, 64.723611]})
df['Time'] = pd.to_datetime(df['Time'])

TrainSet = df[df['Time']<'2015-01-01']
TestSet = df[df['Time']>'2015-01-01']

如果我使用

Train_Y = TrainSet.iloc[:, 1]
Train_X = TrainSet.drop(TrainSet.columns[[0,1]], axis=1)

Test_y = TestSet.iloc[:,1]
Test_x = TestSet.drop(TestSet.columns[[0,1]], axis=1)

它在 Sklearns DummyClassifier() 中运行良好 如果我使用

Columns_to_drop = df.filter(like='Targ', axis = 1).columns.values.tolist()
Columns_to_drop.append('Time')

Train_Y = TrainSet.filter(like='Targ', axis = 1)
Train_X = TrainSet.drop(Columns_to_drop, axis=1)

Test_y = TestSet.filter(like='Targ', axis = 1)
Test_x = TestSet.drop(Columns_to_drop, axis=1)

我在虚拟分类器中遇到错误。

clf = DummyClassifier()
clf.fit(Train_X , Train_Y)
Predict_y = clf.predict(Test_x)

我比较了两个帧,它返回了一个巨大的 TRUE

矩阵
/usr/local/lib/python2.7/dist-packages/sklearn/dummy.pyc in predict(self, X)
    174 
    175             elif self.strategy == "stratified":
--> 176                 ret = proba[k].argmax(axis=1)
    177 
    178             elif self.strategy == "uniform":

AttributeError: 'list' object has no attribute 'argmax'

最佳答案

您用来证明它有效的代码不起作用,因为您对测试和训练集的索引不正确。该代码应该是这样的:

#! Index([u'Col2', u'Col3', u'Model_Targ', u'Time'], dtype='object')
Train_Y = TrainSet.iloc[:, 2]
Train_X = TrainSet.drop(TrainSet.columns[[2,3]], axis=1)

Test_y = TestSet.iloc[:,2]
Test_x = TestSet.drop(TestSet.columns[[2,3]], axis=1)

现在,它在您的第二个代码示例中不起作用的原因是因为您将 DataFrames 返回到您的目标集(Train_Y、Test_y)。这是一个问题,因为 DummyClassifier predict 方法调用了 argmax 方法,DataFrames 本身没有,但它们的列(Series)有。因此,要让您的第二个代码示例正常运行,您只需指定列名即可提取系列。

import pandas as pd
from sklearn.dummy import DummyClassifier

df = pd.DataFrame({'Time':['2013-08-01 00:00:00', '2014-09-01 12:10:00', '2015-02-02 10:10:00', '2016-01-01 00:00:00'], 'Model_Targ':['a', 'b', 'a', 'b'], 'Col2':[-0.945000, -0.855000, -0.860000, -0.945000], 'Col3':[64.384028, 64.485417, 64.609028, 64.723611]})
df['Time'] = pd.to_datetime(df['Time'])

TrainSet = df[df['Time']<'2015-01-01']
TestSet = df[df['Time']>'2015-01-01']

Columns_to_drop = df.filter(like='Targ', axis = 1).columns.values.tolist()
Columns_to_drop.append('Time')

Train_Y = TrainSet.filter(like='Targ', axis = 1)['Model_Targ'] #!
Train_X = TrainSet.drop(Columns_to_drop, axis=1)

Test_y = TestSet.filter(like='Targ', axis = 1)['Model_Targ'] #!
Test_x = TestSet.drop(Columns_to_drop, axis=1)

clf = DummyClassifier()
clf.fit(Train_X , Train_Y)
Predict_y = clf.predict(Test_x)
print Predict_y

关于python - 这两种为 sklearn 分类器过滤 Pandas 数据帧的方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36567961/

相关文章:

python - 使用 Python 如何为 Pandas 数据框中的每一行生成一个范围内的随机数?

python - 使用 loc 更新 pandas 数据框中的行无法正常工作

python - sklearn DictVectorizer(sparse=False) 具有不同的默认值,估算一个常数

python - 如何在 tkinter 框架中嵌入 vlc 实例

python - 如何将文本文件读入np.array?

python - 在 Python 中使用 ReportLabs 生成报告

python - 在 Python 中选择两个时间

python - 如何在 keras 中使用适合生成器的网格搜索

python - sklearn 用户的 R 插入符号

python - 未找到命令 'python.execInTerminal-icon'