Logistic回归:如何将预测值与阈值进行比较并完成分类

时间:2018-04-18 21:17:58

标签: python logistic-regression random-seed

我有这个Credit Default数据集,头像是这样的:

default student balance      income        default_Yes

No      No      729.526495   44361.625074   0 

No      Yes     817.180407   12106.134700   0 

No      No      1073.549164  31767.138947   0 

No      No      529.250605   35704.493935   0 

No      No      785.655883   38463.495879   0 

我正在尝试根据'balance'属性对'default_Yes'执行逻辑回归,并使用以下函数:

 from sklearn.cross_validation import train_test_split
 from sklearn import metrics
 X = cred_def[['balance']]
 Y = cred_def['default_Yes']
 X_train, X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.3,random_state=76)
 logist = LogisticRegression()
 logist.fit(X_train,Y_train)
 y_pred = logist.predict(X_test)


 def model(threshold):
     def_thresh = np.greater(y_pred, threshold).astype(int)
     acc_score = metrics.accuracy_score(Y_test, def_thresh)
     print(acc_score)
     plt.scatter(X_test.values,Y_test.values)
     plt.scatter(X_test.values,def_thresh)
     conf = metrics.confusion_matrix(Y_test, y_pred)
     print(conf)

我面临的问题是:无论我传递给函数'model'的threshold的值是什么,它都会产生相同的输出而不考虑传递的值。

1 个答案:

答案 0 :(得分:1)

编辑(回复此问题陈述的前两个编辑):您不会将任何参数传递给logist = LogisticRegression()。您将random_state=True传递给train_test_split()。不要LogisticRegression

random_state应该是一个整数(随机种子),而不是布尔值 - 读取doc。因此,通过传递将被强制为1的True,您只需继续设置random_state = 1

尝试使用其他一些整数值,你会得到不同的结果。

EDIT2:您的问题与最初标题为random_state的参数无关。这与您的预测值y_pred = logist.predict(X_test)有关,具体来说就是在LR输出值的可能范围[0,1]内扫描threshold参数时的行为方式。向我们展示一个至少有五个不同阈值的表格。如[0,0.25,0.5,0.75,1.0],无论你的意思是什么,"结果"。接下来,你的意思是"结果"?您的准确度是否达到,您的混淆矩阵是什么,或者是什么?现在,忘记混淆矩阵。只需看看将不同阈值应用于同一预测值数组y_pred的效果。此外,您需要完整性检查y_pred,检查它。是全能吗?全零?它的意思是什么,中位数等。请发布一个数据表。不要只是继续说"它不起作用"。