作为一个项目的一部分,我正在尝试使用Python的SKLearn库中的随机森林分类器。我一直在使用本教程作为指南:https://chrisalbon.com/machine_learning/trees_and_forests/random_forest_classifier_example/。
我的代码逐行遵循本教程,但是唯一的主要区别是数据的结构。在本教程中,有4个功能(数据表中的4列),并且列中的每个条目都是一个数字。在我的代码中,我有1个功能(数据表中的1列),并且列中的每个条目都是一个numpy数组。当我调用fit()函数时,出现以下错误: ValueError:设置具有序列的数组元素。
这是我的代码:
import pandas as pd
import numpy as np
import random
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix
trainingData = [[[0, 0, 3], 0.77], [[24, 0, 5], 30], [[0, 0, 4], 0.77], [[0, 0, 0], 0.77]]
vectors_train = []
for i in range (0, len(trainingData)):
vectors_train.append(trainingData[i][0])
testingData = [[[1, 0, 0], 0.77], [[30, 0, 5], 30], [[0, 0, 0], 0.77], [[0, 0, 0], 0.77]]
vectors_test = []
for i in range (0, len(testingData)):
vectors_test.append(testingData[i][0])
dataframe_training = pd.DataFrame(trainingData)
dataframe_training['is_train'] = True
dataframe_testing = pd.DataFrame(testingData)
dataframe_testing['is_train'] = False
frames = [dataframe_training, dataframe_testing]
dataframe = pd.concat(frames)
dataframe.rename(index = str, columns = {0: 'Vector', 1: 'Label', 2: 'is_train'})
train, test = dataframe[dataframe['is_train']==True], dataframe[dataframe['is_train']==False]
features = dataframe.columns[:1]
labels_train, uniques = pd.factorize(train[1], sort = True)
clf = RandomForestClassifier()
clf.fit(train[features], labels) # Value error occurs here
我对错误的实际含义感到困惑。将哪个数组元素设置为一个序列,该序列在哪里?我还知道train[features]
是一个DataFrame对象,并且fit()函数接受两个参数,两个参数都必须类似数组。 labels
是一个数组,错误具体指出问题所在的第一个参数,因此我必须要做数据类型转换吗?
当我将clf.fit(train[features], labels)
行替换为clf.fit(vectors_train, labels)
时,错误消失了。但是,我想知道为什么当我使用与教程相同的策略时它不起作用,以及如何使其以相似的方式起作用。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
出现此错误是因为调用fit
方法时数据格式不正确。
您输入的是列表的DataFrame(只有一列),但是fit
方法需要一个numpy数组。
相反,它应该可以工作:
X = np.array(train[features][0].tolist())
clf.fit(X, labels_train)
所以X是一个包含4个示例的数组,每个示例具有3个功能。
答案 1 :(得分:0)
删除features
变量并进行最后一行:
clf.fit(train[0].tolist(), labels)
上面的代码没有错误。
您的代码无法正常工作,因为您进行columns
时返回column[:1]
会返回一个只有一列的序列,但是column[0]
不会,并且如果您将int馈送到{{1 }}将cls.fit
设为train[features]
来进行columns[0]
,由于它需要一个列表或数组,因此它仍然不起作用,因此features
也将起作用。