Machine learning LogisticRegressionCV错误地预测标签

Machine learning LogisticRegressionCV错误地预测标签,machine-learning,scikit-learn,classification,logistic-regression,Machine Learning,Scikit Learn,Classification,Logistic Regression,我有4个连续变量x_1到x_4,通过原始数据的最小-最大缩放,每个变量分布在[0,1]范围内。我使用LogisticRegression预测类的标签为“1”或“0” 什么不起作用?嗯,我的逻辑回归是预测所有分类为“1”型 剥离=分层剥离剥离=1,测试大小=0.2,随机状态=0 对于序列指数,在split.split数值指数数据中测试指数,y: x_列=数值数据[列指数] y_列=y[列索引] x_检验=数值数据[检验指数] y_检验=y[检验指数] reg=逻辑回归 reg.fitx\U列车,y

我有4个连续变量x_1到x_4,通过原始数据的最小-最大缩放,每个变量分布在[0,1]范围内。我使用LogisticRegression预测类的标签为“1”或“0”

什么不起作用?嗯,我的逻辑回归是预测所有分类为“1”型

剥离=分层剥离剥离=1,测试大小=0.2,随机状态=0 对于序列指数,在split.split数值指数数据中测试指数,y: x_列=数值数据[列指数] y_列=y[列索引] x_检验=数值数据[检验指数] y_检验=y[检验指数] reg=逻辑回归 reg.fitx\U列车,y\U列车 y_pred=reg.predictx_测试 打印分类报告,不支持测试 我有以下问题

LogisticReturnal是这项工作的合适工具吗?因为它可以很好地处理一个热编码数据。 它处理连续数据吗?我想是的。 我是否为LogisticReturnal设置了任何参数不正确?你能推荐更好或更整洁的吗? 最后,我做错什么了吗? 输出


              precision    recall  f1-score

           0       0.00      0.00      0.00
           1       0.90      1.00      0.95

    accuracy                           0.90
   macro avg       0.45      0.50      0.47
weighted avg       0.80      0.90      0.85

UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))

带有逻辑回归的SMOTE代码

os=SMOTErandom\u状态=0 x_序列,x_测试,y_序列,y_测试=序列测试数据,y,测试大小=0.2,随机状态=0 os_data_x,os_data_y=os.fit_samplex_train,y_train os_data_X=pd.DataFramedata=os_data_X,列=['x1',x2',x3',x4'] os_data_Y=pd.DataFramedata=os_data_Y,列=['Y'] x_序列,x_测试,y_序列,y_测试=序列测试分割数据,os_数据,y.values.ravel,测试大小=0.2,随机状态=0 reg.fitx\U列车,y\U列车 y_pred=reg.predictx_测试 打印分类报告,不支持测试
您的数据似乎不平衡,从精度召回表中我们可以看到,类别1占您总数据的近90%。有多种方法可以解决类不平衡问题,您可以参考此了解详细的解决方案

解决这一问题的一个快速解决方案是向模型中添加类权重。目前,代码中的默认值为“无”,这基本上意味着当模型在预测类0而不是类1时,对模型的惩罚更大。首先,可以将“类权重”值从“无”更改为“平衡”,并查看其执行情况

但同时你应该注意,增加类权重也会对类1的性能产生影响,这基本上是一个你需要权衡的问题


希望这有帮助

你的建议确实很有帮助。在我看到你的评论之前,我发现LogisticRegressionCV表现不佳的原因不仅仅是数据不平衡,还有更多。我甚至试着增加班级权重,但没有多大帮助。我尝试了其他分类器,如SVM和感知器,但性能同样糟糕。最后,我做了一个技巧:1对相同数量的“好”标签进行采样,2对现有数据进行随机调整,对“坏”标签进行过采样。我很高兴看到一个叫Nitish Shukla的人也有同样的想法,并且有一篇关于它的研究论文。还有一种叫做SMOTE的技术,你可能会感兴趣去探索。我编辑了原始帖子,并为SMOTE添加了分类报告,其设置与LogisticRegressionCV相同。我非常感谢您帮助我理解这份报告并提出进一步的改进建议。我还有一个问题,如果我有一个不平衡的数据集,那么我是否应该不做分层hufflesplit?相反,我应该洗牌并做K折叠,但确保没有分层,对吗?我将单独尝试KFold,重点关注标签“0”或坏人的召回分数。据我所知,“StratifiedShuffleSplit”在这种情况下比KFold更适用,原因是,当您仅使用KFold时,可能会出现这样的情况,即您的一些数据折叠可能只包含来自多数类的样本,并且如果您要将一个模型与此数据折叠相匹配,那么这是没有意义的。而分层SHUFLFLESPLIT将确保所有折叠的数据中都包含类,并且经过训练的模型将更有意义。
SMOTE + same settings for LogisticRegressionCV

              precision    recall  f1-score

           0       0.63      0.73      0.67
           1       0.68      0.57      0.62

    accuracy                           0.65
   macro avg       0.65      0.65      0.65
weighted avg       0.65      0.65      0.65
Accuracy of classifier on test set: 0.71

              precision    recall  f1-score

           0       0.14      0.70      0.24
           1       0.95      0.57      0.71

    accuracy                           0.58
   macro avg       0.55      0.63      0.47
weighted avg       0.87      0.58      0.67