为scikit-learn准备scipy.io.loadarff的结果

3
我正在尝试使用`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一起使用。
2个回答

6
RandomForestClassifier的文档会告诉你,fit方法的X参数需要传入一个形状为(n_samples, n_features)的二维数组,但是你所拥有的确实是一个一维数组:
>>> target.shape
(150,)
>>> train.shape
(150,)

令人惊讶的是,这个数组的内容不是元组,而是一种我从未遇到过的类型:

>>> train[0]
(5.1, 3.5, 1.4, 0.2)
>>> type(train[0])
<type 'numpy.void'>

此类型未记录,并对asarrayastype做出了相当奇怪的反应,但将其转换为列表再返回数组即可解决问题:

>>> 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)

3

似乎自四月以来有一些变化,loadarff现在返回一个由ndarrayMetaData组成的元组。

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 array

`FutureWarning: Numpy has detected that you may be viewing or writing to an array returned by selecting multiple fields in a structured array.This code may break in numpy 1.13 because this will return a view instead of a copy -- see release notes for details.` - dimid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接