我在训练集和测试集上拟合了一个LogisticRegression
模型,并获得了约80%的准确率
然后我想在测试集上进行预测,根据每个student_id
是否answered_correctly
给出评分(如果回答正确为1,如果回答错误为0)。
我做了以下操作:
features_X = X.columns # 获取X的列名 # X_test是之前train_test_split步骤中创建的数组test_df = pd.DataFrame(columns=features_X, data=X_test)predictions = grid_logit.predict(test_df[features_X])# 创建一个包含预测结果的DataFramesubmission = pd.DataFrame({'Id':test_df['student_id'],'Answered_correctly':predictions})# 查看前5行submission.head()Id Answered_correctly12992348 07268428 09497321 1 588792 15045118 1
如您所见,它将每个用户分类为0或1之间。
但我想要的是这样的结果:
Id Answered_correctly12992348 0.327268428 0.529497321 0.65
answered_correctly_
值对应于属于类别1的概率。
注意:使用predict_proba
函数会返回一个错误:
Exception: Data must be 1-dimensional
编辑:我将predict
替换为predict_proba(test_df[[features_X]])
,但它返回了一个错误:None of [[ features_X cols]] are in the [columns]
回答:
predict_proba
返回每个类别的概率估计值。由于您有两个类别(0和1),它将返回形状为(n_samples, 2)
的数组。
错误消息来自pandas数据框,因为它要求您只传递一维数据。如上所述,predictions
是一个二维输出。
只需将类别1的概率估计值(predictions[:, 1]
)传递给数据框构造函数,它应该能正常工作:
submission = pd.DataFrame({'Id': test_df['student_id'], 'Answered_correctly': predictions[:, 1]})
附加说明:
如果test_df
包含features_X
给出的所有列,您无需传递test_df[features_X]
,因为test_df
应该足够了:
predictions = grid_logit.predict_proba(test_df)