我是机器学习的新手,第一次尝试使用Sklearn。我有两个数据框,一个用于训练逻辑回归模型(使用10倍交叉验证),另一个用于使用该模型预测类别(’0,1’)。这是我迄今为止的代码,部分参考了Sklearn文档和网络上的教程:
import pandas as pdimport numpy as npimport sklearnfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import KFoldfrom sklearn.preprocessing import normalizefrom sklearn.preprocessing import scalefrom sklearn.model_selection import cross_val_scorefrom sklearn.model_selection import cross_val_predictfrom sklearn import metrics# 导入训练数据的数据框df = pd.read_csv('summary_44.csv')cols = df.columns.drop('num_class') # 使用的数据(num_class是包含类别的列)# 导入用于预测的数据框df_pred = pd.read_csv('new_predictions.csv')# 得分df_data = df.ix[:,:-1].values# 目标df_target = df.ix[:,-1].values# 待预测的值df_test = df_pred.ix[:,:-1].values# 得分的名称df_data_names = cols.values# 缩放X, X_pred, y = scale(df_data), scale(df_test), df_target# 定义折数kf = KFold(n_splits=10)kf.get_n_splits(X) # 返回交叉验证器中的分割迭代次数# 逻辑回归标准化变量LogReg = LogisticRegression()# 10倍交叉验证scores = [LogReg.fit(X[train], y[train]).score(X[test], y[test]) for train, test in kf.split(X)]print scores# 预测新数据novel = LogReg.predict(X_pred)
这种实现逻辑回归的方式正确吗?我知道fit()方法应该在交叉验证之后使用,以便训练模型并用于预测。然而,由于我在列表推导式中调用了fit(),我实在不知道我的模型是否已经被“拟合”并且可以用于预测。
回答:
总体来说,事情还算可以,但存在一些问题。
-
缩放
X, X_pred, y = scale(df_data), scale(df_test), df_target
您独立地缩放了训练和测试数据,这是不正确的。两个数据集必须使用同一个缩放器进行缩放。“scale”是一个简单的函数,但最好使用其他东西,例如StandardScaler。
scaler = StandardScaler()scaler.fit(df_data)X = scaler.transform(df_data)X_pred = scaler.transform(df_test)
-
交叉验证和预测。您的代码是如何工作的?您将数据分成10次训练和保留集;10次在训练集上拟合模型并在保留集上计算得分。这样您可以得到交叉验证得分,但模型仅在部分数据上拟合。因此,最好在整个数据集上拟合模型,然后进行预测:
LogReg.fit(X, y)novel = LogReg.predict(X_pred)
我想指出,有一些高级技术如堆叠和提升,但如果您使用sklearn学习,那么最好坚持基础知识。