首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为学习准备scipy.io.loadarff结果

为学习准备scipy.io.loadarff结果
EN

Stack Overflow用户
提问于 2014-04-04 21:35:56
回答 2查看 5K关注 0票数 3

我正在尝试将scikit-learn.arff文件结合使用。考虑以下代码:

代码语言:javascript
复制
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)

它返回以下错误:

代码语言:javascript
复制
ValueError: need more than 1 value to unpack

我认为这与以下事实有关:train是一个元组数组,而不是列表(或数组?);检查sklearn.datasets.load_iris()会显示一个列表数组(数组?)这在RandomForestClassifier中是成功的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-05 09:26:06

RandomForestClassifier的文档将告诉您,fit使用了一个形状(n_samples, n_features)的二维数组作为它的X参数,但是您拥有的确实是一个一维数组:

代码语言:javascript
复制
>>> target.shape
(150,)
>>> train.shape
(150,)

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

代码语言:javascript
复制
>>> train[0]
(5.1, 3.5, 1.4, 0.2)
>>> type(train[0])
<type 'numpy.void'>

这种类型没有文档化,并且对asarrayastype的响应非常奇怪,但是转换到列表列表并返回到数组可以实现这样的效果:

代码语言:javascript
复制
>>> 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)
票数 6
EN

Stack Overflow用户

发布于 2014-08-17 12:39:26

自4月份以来,似乎发生了一些变化,loadarff现在返回了ndarrayMetaData的元组。

代码语言:javascript
复制
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数组

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22873434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档