如何使用sklearn

时间:2017-11-23 22:34:44

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

我想比较同一分类器的预测。 作为示例,我选择了线性判别分析分析器。

因此,我看了一下sklearn的文档。 我找到了这两个网站: Link 1 Link 2

我想将它们链接在一起:在交叉验证的帮助下预测标签(对于示例 Kfold)。

但是,我无法让我的代码工作。

from sklearn.model_selection import cross_val_predict, KFold
from sklearn.model_selection import train_test_split
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

X = np.array([[1, 2], [2, 4], [3, 2], [4, 4], [5, 2], [6, 4], [7, 2], [8, 4]])
Y = np.array([1, 2, 3, 4, 5, 6, 7, 8])

Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,Y,train_size=0.5,random_state=1)

clf = LinearDiscriminantAnalysis()
clf.fit(Xtrain, Ytrain)
LinearDiscriminantAnalysis(n_components=None, priors=None, shrinkage='auto', solver='lsqr', store_covariance=False, tol=0.001)

# without cross-valdidation
prediction = clf.predict(Xtest)

# with cross-valdidation
cv = KFold(n_splits=2)
prediction_cv = cross_val_predict(clf, X, Y, cv=cv)

希望有人可以帮助我。

修改

我想我需要解释一下。 目前,我有232个数据点(X)。每个点由16个值组成,并分配给特定的类。 当我使用交叉验证时,我希望我可以改进预测(=减少看不见的数据点的分类错误),例如 Kfold Leave One Out

使用行cross_val_predict(clf, X, Y, cv=cv),Python会进行Kfold交叉验证。

现在,让我们说,我获得了新的数据点(X_new)。我该如何对它们进行分类?

1 个答案:

答案 0 :(得分:3)

我认为当您运行与此类似的代码时,您将获得一个Traceback:

    376         # avoid division by zero in normalization
    377         std[std == 0] = 1.
--> 378         fac = 1. / (n_samples - n_classes)
    379 
    380         # 2) Within variance scaling

ZeroDivisionError: float division by zero

这就是我运行代码时得到的结果。发生这种情况的原因是因为每个类有1个数据点,因此n_samples - n_classes将等于零。

您可以通过填充更多示例或减少类数量来缓解这种情况:

import numpy as np

from sklearn.model_selection import cross_val_predict, KFold
from sklearn.model_selection import train_test_split
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

X = np.array([[1, 2], [2, 4], [3, 2], [4, 4], [5, 2], [6, 4], [7, 2], [8, 4], [1, 2], [2, 4], [3, 2], [4, 4], [5, 2], [6, 4], [7, 2], [8, 4]])
Y = np.array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8])

Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,Y,train_size=0.5,random_state=1)

clf = LinearDiscriminantAnalysis()
clf.fit(X, Y)

# without cross-valdidation
prediction = clf.predict(Xtest)

# with cross-valdidation
cv = KFold(n_splits=2)
prediction_cv = cross_val_predict(clf, X, Y, cv=cv)

如果您还有其他问题,请更新您的问题。

修改

对于您更新的问题,它与此问题重复:Using cross_val_predict against test data set