我对sklearn相对较新,并且一直在尝试使用以下代码:
from sklearn.ensemble import RandomForestClassifier
from numpy import genfromtxt, savetxt
def main():
#create the training & test sets, skipping the header row with [1:]
dataset = genfromtxt(open('mypath\data1.csv','r'), delimiter=',', dtype='f8')[1:]
target = [x[0] for x in dataset]
train = [x[1:] for x in dataset]
test = genfromtxt(open('mypath\data1.csv','r'), delimiter=',', dtype='f8')[1:]
#create and train the random forest
#multi-core CPUs can use: rf = RandomForestClassifier(n_estimators=100, n_jobs=2)
rf = RandomForestClassifier(n_estimators=100)
rf.fit(train, target)
savetxt(myoutput\data1_output.csv', rf.predict(test), delimiter=',', fmt='%f')
if __name__=="__main__":
main()
此代码在包含三列的.csv文件上运行随机林分类器,第一列包含标签,而其他两列包含要素。运行此程序时,我收到以下错误:
ValueError: Number of features of the model must match the input. Model n_features is 2 and input n_features is 3
我最初的假设是有一个名为n_features的组件,我需要根据我的用例进行调整。但是,它似乎比这更复杂。是否有人能够解释我是否以及如何获得上述类型的.csv以成功运行此代码?
我确实看到了this post,这表明问题是代码将我的标签作为功能包含在内。但是,我真的不明白解决这个问题的解决方案是如何解决这个问题的,所以非常感谢其他解释。
答案 0 :(得分:1)
csv文件的形状为(n_examples, 3)
。在调用时,将此数组拆分为两个包含响应变量和输入变量的列表:
target = [x[0] for x in dataset]
train = [x[1:] for x in dataset]
因此,target
是形状(n_examples, 1)
,train
是形状(n_examples, 2)
。接下来,您将读入相同的csv文件进行测试(我不知道为什么您要使用培训数据进行测试或此时需要再次读取文件的原因)。无论如何,这意味着test
的形状为(n_examples, 3)
。
predict使用通过调用fit
获知的模型参数获取输入并生成响应。因此,predict
期望接收形状(2,)
的输入变量列表或形状(n_examples, 2)
的数组。你应该看看现在发生了不匹配的地方。
要解决此问题,请致电rf.predict(test[1:, 1:])
。这个片段从第1行开始到第1列以后的所有内容,跳过第一行,假设它包含标题信息(您应检查标题是否确实已读入)并跳过每行的第一列以跳过响应变量每个例子。
当然,由于测试是从与训练数据相同的文件中读取的,因此相当于rf.predict(train)
。