sklearn grid.fit(X,y) - 错误:X_train,y_train 的“位置索引器超出范围”
Posted
技术标签:
【中文标题】sklearn grid.fit(X,y) - 错误:X_train,y_train 的“位置索引器超出范围”【英文标题】:sklearn grid.fit(X,y) - error: “positional indexers are out-of-bounds” for X_train,y_train 【发布时间】:2016-06-30 02:46:19 【问题描述】:这是一个关于 Python 2.7 和 Pandas 0.17.1 中的 scikit learn(版本 0.17.0)的问题。为了使用详细的here 方法拆分原始数据(没有丢失条目),我发现如果使用拆分数据继续处理.fit()
,则会出现错误。
这里的代码与另一个 *** 问题中的变量重命名基本相同。然后我实例化了一个网格并尝试拟合拆分数据,以确定最佳分类器参数。错误出现在下面代码最后一行之后:
import pandas as pd
import numpy as np
# UCI's wine dataset
wine = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv")
# separate target variable from dataset
y = wine['quality']
X = wine.drop(['quality','color'],axis = 1)
# Stratified Split of train and test data
from sklearn.cross_validation import StratifiedShuffleSplit
sss = StratifiedShuffleSplit(y, n_iter=3, test_size=0.2)
# Split dataset to obtain indices for train and test set
for train_index, test_index in sss:
xtrain, xtest = X.iloc[train_index], X.iloc[test_index]
ytrain, ytest = y[train_index], y[test_index]
# Pick some classifier here
from sklearn.tree import DecisionTreeClassifier
decision_tree = DecisionTreeClassifier()
from sklearn.grid_search import GridSearchCV
# Instantiate grid
grid = GridSearchCV(decision_tree, param_grid='max_depth':np.arange(1,3), cv=sss, scoring='accuracy')
# this line causes the error message
grid.fit(xtrain,ytrain)
这是上面代码产生的错误信息:
Traceback (most recent call last):
File "C:\Python27\test.py", line 23, in <module>
grid.fit(xtrain,ytrain)
File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 804, in fit
return self._fit(X, y, ParameterGrid(self.param_grid))
File "C:\Python27\lib\site-packages\sklearn\grid_search.py", line 553, in _fit
for parameters in parameter_iterable
File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 800, in __call__
while self.dispatch_one_batch(iterator):
File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 658, in dispatch_one_batch
self._dispatch(tasks)
File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 566, in _dispatch
job = ImmediateComputeBatch(batch)
File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 180, in __init__
self.results = batch()
File "C:\Python27\lib\site-packages\sklearn\externals\joblib\parallel.py", line 72, in __call__
return [func(*args, **kwargs) for func, args, kwargs in self.items]
File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 1524, in _fit_and_score
X_train, y_train = _safe_split(estimator, X, y, train)
File "C:\Python27\lib\site-packages\sklearn\cross_validation.py", line 1591, in _safe_split
X_subset = safe_indexing(X, indices)
File "C:\Python27\lib\site-packages\sklearn\utils\__init__.py", line 152, in safe_indexing
return X.iloc[indices]
File "C:\Python27\lib\site-packages\pandas\core\indexing.py", line 1227, in __getitem__
return self._getitem_axis(key, axis=0)
File "C:\Python27\lib\site-packages\pandas\core\indexing.py", line 1504, in _getitem_axis
self._is_valid_list_like(key, axis)
File "C:\Python27\lib\site-packages\pandas\core\indexing.py", line 1443, in _is_valid_list_like
raise IndexError("positional indexers are out-of-bounds")
IndexError: positional indexers are out-of-bounds
注意:
将X
和y
保留为 Pandas 数据结构对我来说很重要,类似于上面另一个 *** 问题中提出的第二种方法。即我不想使用X.values
和y.values
。
问题:
使用原始数据作为 Pandas 数据结构(X
为 DataFrame
,y
为 Series
),有没有办法运行 grid.fit()
而不会收到此错误消息?
【问题讨论】:
此脚本中的一个问题是 CV 对象 sss 正在为 y 中的所有行生成索引。当您调用 grid.fit - 您只给它 xtrain、ytrain,它们比 y 短,因此位置索引器超出范围。创建 sss 后,您无需拆分数据帧。将整个 X 和 y 传递给 grid.fit 并根据 sss 的索引进行拆分。 没错,但我也给它y_test
。 X_test
的大小与 y_test
的大小相匹配。这不应该意味着位置索引器匹配吗?
@WR,不,您将y
提供给StratifiedShuffleSplit
,将xtrain, ytrain
提供给grid.fit
。这是问题的根源。
【参考方案1】:
你应该把X
和y
直接传给fit()
,点赞
grid.fit(X, y)
GridSearchCV
会照顾好
xtrain, xtest = X.iloc[train_index], X.iloc[test_index]
ytrain, ytest = y[train_index], y[test_index]
StratifiedShuffleSplit
实例在迭代时会产生成对的训练/测试拆分索引:
>>> list(sss)
[(array([2531, 4996, 4998, ..., 3205, 2717, 4983]), array([5942, 893, 1702, ..., 6340, 4806, 2537])),
(array([1888, 2332, 6276, ..., 1674, 775, 3705]), array([3404, 3304, 4741, ..., 4397, 3646, 1410])),
(array([1517, 3759, 4402, ..., 5098, 4619, 4521]), array([1110, 4076, 1280, ..., 6384, 1294, 1132]))]
GridSearchCV
将使用这些索引来分割训练样本。无需您手动操作。
发生错误是因为您将 xtrain
和 ytrain
(训练/测试拆分之一)输入交叉验证器。交叉验证器尝试访问存在于完整数据集中但不在训练/测试拆分中的项目,这会引发IndexError
。
【讨论】:
但是如何创建一个保留集呢?不拆分就无法得到x_test
、y_test
。或者是否有另一种方法可以为X
和y
创建保留数据集?
交叉验证意味着迭代多个训练/测试拆分(在您的情况下为 3),并对分数进行平均。 GridSearchCV
自动执行此操作。为什么你需要另一个保留集?
如果你真的想保留一大块数据,你可以使用train_test_split
之类的东西,它只会产生数据的单个拆分(而不是可迭代的拆分)。最后,您需要确保使用来自您传递给fit(...)
的X, y
元组的y
实例化StratifiedShuffleSplit
。
如果您也执行StratifiedShuffleSplit(y_train, ...)
,您所描述的将起作用。我的问题是,你打算用X_test, y_test
做什么?
您不会使用X_train
、y_train
训练分类器,然后使用X_test
、y_test
评估分类器吗?以上是关于sklearn grid.fit(X,y) - 错误:X_train,y_train 的“位置索引器超出范围”的主要内容,如果未能解决你的问题,请参考以下文章
sklearn中的x_test、x_train、y_test、y_train有啥区别?
Scikit-learn GridSearchCV - 为啥我在执行 grid.fit() 时会收到数据类型错误?
报错整理:ImportError: cannot import name ‘mean_absolute_percentage_error‘ from ‘sklearn.metrics‘
从 SKlearn 决策树中检索决策边界线(x,y 坐标格式)
Groupby 在一列 pandas 数据帧上,并使用 GridsearchCv 使用通用 sklearn 管道训练每个组的特征和目标 (X, y)