我正在尝试将scikit-learn与.arff文件结合使用。考虑以下代码:
from sklearn.ensemble import RandomForestClassifier
from scipy.io.arff import loadarff
import scipy as sp
import numpy as np
dataset = loadarff(open('iris.arff','r'))
target = np.array(dataset[0]['class'])
train = np.array(dataset[0][['sepallength', 'sepalwidth', 'petallength', 'petalwidth']])
rf = RandomForestClassifier(n_estimators = 20, n_jobs = 8)
rf.fit(train, target)它返回以下错误:
ValueError: need more than 1 value to unpack我认为这与以下事实有关:train是一个元组数组,而不是列表(或数组?);检查sklearn.datasets.load_iris()会显示一个列表数组(数组?)这在RandomForestClassifier中是成功的。
发布于 2014-04-05 09:26:06
RandomForestClassifier的文档将告诉您,fit使用了一个形状(n_samples, n_features)的二维数组作为它的X参数,但是您拥有的确实是一个一维数组:
>>> target.shape
(150,)
>>> train.shape
(150,)令人惊讶的是,这个数组的内容不是元组,而是我以前从未遇到过的类型:
>>> train[0]
(5.1, 3.5, 1.4, 0.2)
>>> type(train[0])
<type 'numpy.void'>这种类型没有文档化,并且对asarray和astype的响应非常奇怪,但是转换到列表列表并返回到数组可以实现这样的效果:
>>> X = np.asarray(train.tolist(), dtype=np.float32)
>>> X.shape
(150, 4)
>>> rf.fit(X, target)
RandomForestClassifier(bootstrap=True, compute_importances=None,
criterion='gini', max_depth=None, max_features='auto',
max_leaf_nodes=None, min_density=None, min_samples_leaf=1,
min_samples_split=2, n_estimators=20, n_jobs=8,
oob_score=False, random_state=None, verbose=0)发布于 2014-08-17 12:39:26
自4月份以来,似乎发生了一些变化,loadarff现在返回了ndarray和MetaData的元组。
with open('training_set.arff','r') as f:
data, meta = loadarff(f)
print(type(data)) # <class 'numpy.ndarray'>
print(type(meta)) # <class 'scipy.io.arff.arffread.MetaData'>更具体地说,data似乎是一个记录数组。可以使用以下代码段将其转换为正常的numpy数组
train_data = data[meta.names()[:-1]] #everything but the last column
train_data = train_data.view(np.float).reshape(data.shape + (-1,)) #converts the record array to a normal numpy arrayhttps://stackoverflow.com/questions/22873434
复制相似问题