使用sklearn

时间:2015-06-27 14:25:19

标签: python machine-learning scikit-learn classification cross-validation

我正在开发一个数据挖掘项目,我在python中使用sklearn包来分类我的数据。

为了训练我的数据并评估预测值的质量,我使用 sklearn.cross_validation.cross_val_predict 函数。

但是,当我尝试在测试数据上运行我的模型时,它会询问基类,这些基类不可用。

我已经看过(可能)使用 sklearn.grid_search.GridSearchCV 函数解决方法,但我不愿意将这种方法用于一组固定的参数。

通过sklearn.cross_validation文档,我遇到了 cross_val_score 函数。由于我对分类问题的世界相当新,我不太确定这是否能解决我的问题。

任何帮助都会很棒!

谢谢!

编辑:

您好!我得到的印象是我对原始查询相当模糊。我会尝试详细说明我正在做的事情。这是:

我已经生成了3个numpy.ndarrays X,X_test和y,分别为nrows = 10158,22513和10158,它们对应于我的列车数据,测试数据和列车数据的类别标签。

此后,我运行以下代码:

    from sklearn.svm import SVC
    from sklearn.cross_validation import cross_val_predict
    clf = SVC()
    testPred = cross_val_predict(clf,X,y,cv=2)

这很好用,然后我可以使用教程中提到的stemPred和y。

但是,我希望预测X_test的类。错误信息是不言自明的,并说:

    ValueError: Found arrays with inconsistent numbers of samples: [10158 22513]

当前的解决方法(我不知道这是一种解决方法还是唯一的方法)我使用的是:

    from sklearn import grid_search
    # thereafter I create the parameter grid (grid) and appropriate scoring function (scorer)
    model = grid_search.GridSearchCV(estimator = clf, param_grid = grid, scoring = scorer, refit = True, cv = 2, n_jobs = -1)
    model.fit(X,y)
    model.best_estimator_.fit(X,y)
    testPred = model.best_estimator_.predict(X_test)

这项技术适用于暂时的工作;但是,如果我不必使用 GridSearchCV 功能,我就能睡得更好。

1 个答案:

答案 0 :(得分:0)

IIUC,你将不同的东西混为一谈。

假设您有一个具有给定方案的分类器。然后,您可以对某些数据进行训练,并预测(通常是其他)数据。这很简单,看起来像这样。

首先,我们构建预测器并使其适合。

from sklearn import svm, grid_search, datasets
from sklearn.cross_validation import train_test_split
iris = datasets.load_iris()
clf = svm.SVC()
train_x, test_x, train_y, test_y = train_test_split(iris.data, iris.target)
>> clf.fit(train_x, train_y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False)

现在它已完全构建,您可以使用它进行预测。

>> clf.predict(test_x)
array([1, 0, 0, 2, 0, 1, 1, 1, 0, 2, 2, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 2, 0,
   1, 0, 2, 0, 2, 1, 2, 1, 2, 2, 2, 1, 0, 0, 0])

就这么简单。

这里发生了什么?

  • 分类器有一个完全指定的方案 - 它只需要调整其参数

  • 分类器根据列车数据调整其参数

  • 分类器已准备好预测

在许多情况下,分类器有一个需要使用参数进行调整的方案,但它也有元参数。一个示例是分类器的degree参数。

你应该如何调整它们?有很多方法。

  • 唐'吨。只需坚持默认值(这就是我的例子所做的)

  • 使用某种形式的交叉验证(例如,网格搜索)

  • 使用某种复杂程度,例如AIC,BIC等。

因此,重要的是不要混淆这些事情。交叉验证不是获取测试数据预测器的一些技巧。具有默认参数的预测器已经可以这样做。交叉验证用于调整元参数。选择它们后,您可以调整参数。然后你有一个不同的预测器。