在 MLPClassification Python 中实现 K 折交叉验证
Posted
技术标签:
【中文标题】在 MLPClassification Python 中实现 K 折交叉验证【英文标题】:Implement K-fold cross validation in MLPClassification Python 【发布时间】:2017-11-24 18:38:33 【问题描述】:我正在学习如何使用 scikit-learn 开发反向传播神经网络。我仍然对如何在我的神经网络中实现 k 折交叉验证感到困惑。我希望你们能帮助我。我的代码如下:
import numpy as np
from sklearn.model_selection import KFold
from sklearn.neural_network import MLPClassifier
f = open("seeds_dataset.txt")
data = np.loadtxt(f)
X=data[:,0:]
y=data[:,-1]
kf = KFold(n_splits=10)
X_train, X_test, y_train, y_test = X[train], X[test], y[train], y[test]
clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)
clf.fit(X, y)
MLPClassifier(activation='relu', alpha=1e-05, batch_size='auto',
beta_1=0.9, beta_2=0.999, early_stopping=False,
epsilon=1e-08, hidden_layer_sizes=(5, 2), learning_rate='constant',
learning_rate_init=0.001, max_iter=200, momentum=0.9,
nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
warm_start=False)
【问题讨论】:
我认为您的意图是您想要进行 kfold 拆分以及评分。你可以使用cross_val_score
。它会为你做 Kfold,同时生成分数列表。
【参考方案1】:
不要将数据拆分为训练和测试。这由 KFold 交叉验证自动处理。
from sklearn.model_selection import KFold
kf = KFold(n_splits=10)
clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1)
for train_indices, test_indices in kf.split(X):
clf.fit(X[train_indices], y[train_indices])
print(clf.score(X[test_indices], y[test_indices]))
KFold 验证将您的数据集划分为 n 个相等、公平的部分。然后将每个部分分成测试和训练。这样,您就可以对模型的准确性进行相当准确的测量,因为它是在一小部分相当分布的数据上进行测试的。
【讨论】:
我的预测准确率是 0% 我不知道我做错了什么 @Trung 有代码吗?不,我过去用这个效果很好。您的数据可能有问题。检查以确保X
和y
具有相同的长度,并且X[i]
中的每个值都对应于y[i]
。将打印语句进行检查。
你也可以试试clf = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1, verbose=True)
,看看它在训练期间打印了什么。
您也可以将求解器更改为adam
,看看是否有区别。
@Coldpseed 谢谢,当我把它改成亚当时它起作用了。我认为我的隐藏层大小是错误的。我会检查一下。再次感谢您的帮助【参考方案2】:
感谢@COLDSPEED 的回答。
如果您想进行 n 折交叉验证的预测,cross_val_predict() 是可行的方法。
# Scamble and subset data frame into train + validation(80%) and test(10%)
df = df.sample(frac=1).reset_index(drop=True)
train_index = 0.8
df_train = df[ : len(df) * train_index]
# convert dataframe to ndarray, since kf.split returns nparray as index
feature = df_train.iloc[:, 0: -1].values
target = df_train.iloc[:, -1].values
solver = MLPClassifier(activation='relu', solver='adam', alpha=1e-5, hidden_layer_sizes=(5, 2), random_state=1, verbose=True)
y_pred = cross_val_predict(solver, feature, target, cv = 10)
基本上,选项 cv 表示您希望在训练中进行多少次交叉验证。 y_pred 与目标大小相同。
【讨论】:
【参考方案3】:如果您正在寻找已经内置的方法来执行此操作,您可以查看cross_validate。
from sklearn.model_selection import cross_validate
model = MLPClassifier()
cv_results = cross_validate(model, X, Y, cv=10,
return_train_score=False,
scoring=model.score)
print("Fit scores: ".format(cv_results['test_score']))
我喜欢这种方法的一点是它可以让您访问 fit_time、score_time 和 test_score。它还允许您提供您选择的评分指标和交叉验证生成器/可迭代(即 Kfold)。另一个很好的资源是Cross Validation。
【讨论】:
以上是关于在 MLPClassification Python 中实现 K 折交叉验证的主要内容,如果未能解决你的问题,请参考以下文章