Sklearn GridSearchCV使用Pandas DataFrame列

时间:2016-04-06 17:01:22

标签: python pandas machine-learning scikit-learn grid-search

我在SGDC分类器(随机梯度下降分类器)上从Sklearn库运行GridSearchCV(网格搜索交叉验证)。我正在使用Pandas的DataFrame来获取功能和目标。这是代码:

from sklearn.grid_search import GridSearchCV
parameters = {'loss': [ 'hinge', 'log', 'modified_huber', 'squared_hinge', 'perceptron'], 'alpha': [0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001], 'n_iter': list(np.arange(1,1001))}
clf = GridSearchCV(estimator = SGDClassifier(), param_grid = parameters, scoring = 'f1')
print(clf)
clf.fit(X_train, y_train)

其中X_train是300行x 31列Pandas DataFrame,每列由以下命名:

['school', 'sex', 'age', 'address', 'famsize', 'Pstatus', 'Medu', 'Fedu', 'Mjob', 'Fjob', 'reason', 'guardian', 'traveltime', 'studytime', 'failures', 'schoolsup', 'famsup', 'paid', 'activities', 'nursery', 'higher', 'internet', 'romantic', 'famrel', 'freetime', 'goout', 'Dalc', 'Walc', 'health', 'absences']

y_train是一个300行x 1列的Pandas系列,由以下内容命名:

['passed']

当我尝试使用GridSearchCV算法时,我收到以下错误声明:

IndexError: too many indices for array

1 个答案:

答案 0 :(得分:2)

下面的代码准备了一个符合您定义的随机数据集:

  • X_train = 300x31 DataFrame
  • y_train = 300x1系列有2个类,0和1)。

使用代码下方的X_train和y_train ,因此问题可能出在数据本身。

import pandas as pd
import numpy as np

N = 300
D = 31

y_train = pd.Series([0,1]*(N/2))
X_train = np.matrix(y_train).T.repeat(D, axis=1) + np.random.normal(size=(N, D))
X_train = pd.DataFrame(X_train)

实际上,您提到DataFrame有31列,但您提供的列名列表只有30个元素。问题可能在于构建X_train。

(我用较少的参数完成了测试,这里是可重复性的简化版本:)

from sklearn.grid_search import GridSearchCV
from sklearn.linear_model import SGDClassifier
parameters = {'loss': [ 'hinge', 'log', 'modified_huber', 'squared_hinge', 'perceptron'], 'alpha': [0.1, 0.01], 'n_iter': [1,2, 1000]}
clf = GridSearchCV(estimator = SGDClassifier(), param_grid = parameters, scoring = 'f1')
print(clf)
clf.fit(X_train, y_train)