如何使用交叉验证 (Kfold) 和 sklearn 预测标签
How to predict labels using cross-validation (Kfold) with sklearn
我想比较同一个 classifier 的预测。
作为 示例,我选择了线性判别分析 classifier。
因此,我看了一下sklearn的文档。
我找到了这两个网站:
Link 1
Link 2
我想 link 它们一起:借助交叉验证预测标签(对于 example 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 个值组成,并分配给特定的 class。
我希望当我使用交叉验证时,我可以改进预测(=更少 class 看不见的数据点的化错),比如 Kfold 或 留一.
使用行 cross_val_predict(clf, X, Y, cv=cv)
,Python 进行 Kfold 交叉验证。
现在,比方说,我得到了新的数据点 (X_new
)。我怎样才能 class 验证它们?
我认为当您 运行 您的代码看起来与此类似时,您会得到一个回溯:
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
这就是我 运行 你的代码时得到的结果。发生这种情况的原因是因为每个 class 都有 1 个数据点,因此 n_samples - n_classes
将等于零。
您可以通过填充更多示例或减少 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)
如果您有其他问题,请更新您的问题。
编辑:
对于你更新的问题,它是这个问题的副本:
我想比较同一个 classifier 的预测。 作为 示例,我选择了线性判别分析 classifier。
因此,我看了一下sklearn的文档。 我找到了这两个网站: Link 1 Link 2
我想 link 它们一起:借助交叉验证预测标签(对于 example 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 个值组成,并分配给特定的 class。 我希望当我使用交叉验证时,我可以改进预测(=更少 class 看不见的数据点的化错),比如 Kfold 或 留一.
使用行 cross_val_predict(clf, X, Y, cv=cv)
,Python 进行 Kfold 交叉验证。
现在,比方说,我得到了新的数据点 (X_new
)。我怎样才能 class 验证它们?
我认为当您 运行 您的代码看起来与此类似时,您会得到一个回溯:
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
这就是我 运行 你的代码时得到的结果。发生这种情况的原因是因为每个 class 都有 1 个数据点,因此 n_samples - n_classes
将等于零。
您可以通过填充更多示例或减少 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)
如果您有其他问题,请更新您的问题。
编辑:
对于你更新的问题,它是这个问题的副本: