我首先使用train_test_split分隔火车和测试数据,代码:
X=LOG.iloc[:,:-3]
y=LOG.iloc[:,-3]
X_train,X_test,y_train, y_test=train_test_split(X,y)
scaler=MinMaxScaler().fit(X)
X_train_scaled=scaler.transform(X_train)
X_test_scaled=scaler.transform(X_test)
for thisalpha in [0.1,1,10]:
mlpreg=MLPRegressor(hidden_layer_sizes=(11,8,4),
activation ="tanh",
alpha = thisalpha,
solver ="lbfgs",max_iter=20000).fit(X_train_scaled, y_train)
y_test_predict = mlpreg.predict(X_test_scaled)
y_train_predict= mlpreg.predict(X_train_scaled)
print "aipha = {}, train score= {:.4f}, test score = {:.4f}, iter_number={}, loss={:.4f}".format(
thisalpha,
mlpreg.score(X_train_scaled,y_train),
mlpreg.score(X_test_scaled,y_test),
mlpreg.n_iter_,
mlpreg.loss_)
我得到这样的表现:
aipha = 0.1,火车成绩= 0.7696,测试成绩= 0.7358
aipha = 1,火车分数= 0.7419,测试分数= 0.7219
aipha = 10,火车成绩= 0.6414,测试成绩= 0.6494
然后我尝试使用交叉验证来测试相同的数据集,我的得分要低得多:
X=LOG.iloc[:,:-3]
y=LOG.iloc[:,-3]
scaler= MinMaxScaler()
X_scaled=scaler.fit_transform(X)
clf=MLPRegressor(hidden_layer_sizes=(11,8,4),alpha=
1,solver="lbfgs",max_iter=20000)
scores = cross_val_score(clf,X_scaled,y,cv=3)
print scores
cross_val_score是:
[0.04719619 0.36858483 0.36004186]
答案 0 :(得分:1)
我找到了问题所在。我的数据实际上是以“堆栈”的方式放置的:所有的第一个类在顶部,然后第n个类在底部。所以这给了我奇怪的结果。我是这样更改代码的,首先需要对数据进行混洗,然后再使用交叉验证方法。
kfold = KFold(n_splits=3,shuffle=True,random_state=0)
X_scaled=scaler.fit_transform(X)
clf=MLPRegressor(hidden_layer_sizes=(11,8,4),alpha= 1,solver="lbfgs",max_iter=20000)
scores = cross_val_score(clf,X_scaled,y,cv=kfold)
print scores
我得到这样的分数:
[0.68697805 0.70411961 0.69466066]
答案 1 :(得分:0)
查看您的代码,也许是因为在运行交叉验证模型时遗漏了activation="tanh"
。否则,我看到的唯一真正的不同是,在第一种情况下,您正在测试25%的数据,而在第二种情况下,您正在测试的数据为33%。这不会像您显示的那样严重影响准确性。
请注意,您不应使用验证/测试集来适应缩放器,因为这会将模型(间接)暴露给测试数据。在第一种情况下,此问题很容易解决,但在使用cross_val_score
时更难处理。