【问题标题】:How to increase the model accuracy of logistic regression in Scikit python?如何提高 Scikit python 中逻辑回归的模型精度?
【发布时间】:2016-10-30 20:07:57
【问题描述】:

我正在尝试使用 gre、gpa 和ranks 等预测变量来预测承认变量。但预测准确度非常低(0.66)。数据集如下所示。 https://gist.github.com/abyalias/3de80ab7fb93dcecc565cee21bd9501a

请在下面找到代码:

 In[73]: data.head(20)
 Out[73]: 

   admit  gre   gpa  rank_2  rank_3  rank_4
0      0  380  3.61     0.0     1.0     0.0
1      1  660  3.67     0.0     1.0     0.0
2      1  800  4.00     0.0     0.0     0.0
3      1  640  3.19     0.0     0.0     1.0
4      0  520  2.93     0.0     0.0     1.0
5      1  760  3.00     1.0     0.0     0.0
6      1  560  2.98     0.0     0.0     0.0

y = data['admit']
x = data[data.columns[1:]]

from sklearn.cross_validation import  train_test_split
xtrain,xtest,ytrain,ytest  = train_test_split(x,y,random_state=2)

ytrain=np.ravel(ytrain)

#modelling 
clf = LogisticRegression(penalty='l2')
clf.fit(xtrain,ytrain)
ypred_train = clf.predict(xtrain)
ypred_test = clf.predict(xtest)

In[38]: #checking the classification accuracy
accuracy_score(ytrain,ypred_train)
Out[38]: 0.70333333333333337
In[39]: accuracy_score(ytest,ypred_test)
Out[39]: 0.66000000000000003

In[78]: #confusion metrix...
from sklearn.metrics import confusion_matrix
confusion_matrix(ytest,ypred)

Out[78]: 
array([[62,  1],
       [33,  4]])

那些是错误的预测。如何提高模型的准确性?

【问题讨论】:

  • 您可以从调整逻辑回归的 C 参数开始。您还可以尝试不同的分类方法,例如 SVM 和树。
  • 您不应该尝试优化测试集的准确性。您应该优化训练集并将测试集用作方法的对象评估。您可以根据训练集编辑答案以显示准确度分数吗?
  • 嗨,添加了基于训练集的准确度。
  • @geompalik,我试过把C=0.01,100。当100时,训练集的准确率提高到72.66%,测试集的准确率是68.99%。但仍然没有显着差异跨度>
  • 两点:(i) 如上面的 ncfirth 所示,在训练集上评估模型通常是一种不好的做法,因为模型适合训练数据,而这样的分数不会说明它的任何信息概括能力。您应该选择交叉验证。 (ii) 我同意以下 Abhinav 的观点。我建议尝试规范化你的 gre 和 gpa,因为它们的值支配你的特征向量。例如:scikit-learn.org/stable/modules/generated/…

标签: python machine-learning scikit-learn regression logistic-regression


【解决方案1】:

由于机器学习更多的是对功能和模型进行试验,因此您的问题没有正确答案。我给你的一些建议是:

1.特征缩放和/或标准化 - 检查您的 gregpa 特征的比例。它们相差 2 个数量级。因此,您的 gre 特征最终将在逻辑回归等分类器中支配其他特征。在将所有特征放入机器学习模型之前,您可以将它们标准化为相同的比例。This 是关于 scikit-learn 中可用的各种特征缩放和标准化类的一个很好的指南。

2。类不平衡 - 查找数据中的类不平衡。由于您正在使用承认/拒绝数据,因此拒绝的数量将明显高于承认的数量。 SkLearn 中的大多数分类器,包括LogisticRegression,都有一个class_weight 参数。将其设置为 balanced 在类不平衡的情况下也可能会很好地工作。

3.优化其他分数 - 您还可以优化其他指标,例如 Log LossF1-Score。在班级不平衡的情况下,F1-Score 可能很有用。 This 是一个很好的指南,更多地谈论得分。

4.超参数调整 - 网格搜索 - 您可以通过执行网格搜索来调整模型的超参数来提高准确性。例如在LogisticRegression 的情况下,参数C 是一个超参数。此外,您应该避免在网格搜索期间使用测试数据。而是执行交叉验证。仅使用您的测试数据来报告最终模型的最终数字。请注意,应该对您尝试的所有模型进行 GridSearch,因为只有您才能知道从每个模型中可以获得的最佳值是什么。 Scikit-Learn 为此提供了GridSearchCV 类。 This文章也是一个不错的起点。

5.探索更多分类器 - Logistic Regression 学习一个线性决策面来区分你的类。您的 2 个类可能不是线性可分的。在这种情况下,您可能需要查看其他分类器,例如 Support Vector Machines,它们能够学习更复杂的决策边界。您还可以开始查看基于树的分类器,例如 Decision Trees,它可以从您的数据中学习规则。将它们视为算法自动从数据中学习的一系列 If-Else 规则。通常,很难使用决策树获得正确的Bias-Variance Tradeoff,因此如果您有大量数据,我建议您查看Random Forests

6.错误分析 - 对于您的每个模型,返回并查看它们失败的情况。您最终可能会发现您的某些模型在参数空间的一部分上运行良好,而其他模型在其他部分上运行良好。如果是这种情况,那么Ensemble TechniquesVotingClassifier 技术通常会给出最好的结果。赢得 Kaggle 比赛的模型很多时候都是集成模型。

7.更多功能 _ 如果所有这些都失败了,那么这意味着您应该开始寻找更多功能。

希望有帮助!

【讨论】:

  • 不错的答案。您能否详细说明You can optimize on other metrics also such as Log Loss and F1-Score.我们如何做到这一点?感谢您的帮助!
  • 关于 4. 超参数调优,贝叶斯优化这些天让人们兴奋不已。它应在模型性能与测试的超参数组合数量之间提供适当的平衡。
猜你喜欢
  • 2020-10-30
  • 2021-06-02
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 2017-06-11
  • 2013-09-30
  • 2019-04-11
  • 2017-03-31
相关资源
最近更新 更多