数据说明
使用之前的数据data_all.csv
1任务
- 记录7个模型(逻辑回归、SVM、决策树、随机森林、GBDT、XGBoost和LightGBM)关于accuracy、precision,recall和F1-score、auc值的评分表格,并画出ROC曲线。
2解决的问题
- 关于sklearn.preprocessing中scale和StandardScaler的两种数据标准化方式的区别,其实两者是一样的,只是scale()是一个方法,可以直接将给定数据进行标准化。而StandardScaler是一个实现了Transformer API的类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。一般情况下最好只用后者。详细情况参照 参考1。数据标准化主要功能就是消除变量间的量纲关系,从而使数据具有可比性。
- 对ROC曲线和AUC值的理解:ROC曲线的线下面积,即AUC值,该值显然是越大,分类器性能越好. 同时注意,计算ROC曲线时,并不是使用分类结果,而是使用预测得分[可以是正类的估计概率、置信值或者分类器方法 “decision_function” 的返回值;](一开始就是这里没搞明白)。画ROC曲线时,依次将所有样本的预测得分作为阈值,然后得到TPR(True Positive Rate, True positive/Actual positive )和FPR(False Positive Rate, False positive / Actual negative), 然后作图,详细情况参照参考2。
- sklearn.metrics.auc和sklearn.metrics.roc_auc_score都可以计算AUC值,roc_auc_score 是 预测得分曲线下的 auc,在计算的时候调用了 auc,需要仔细理解roc_auc_score(y_true, y_score, average=‘macro’, sample_weight=None)中各个参数的意义。详细情况参照参考3。
- sklearn中的predict与predict_proba的区别: predict返回的是一个大小为n的一维数组,一维数组中的第i个值为模型预测第i个预测样本的标签;predict_proba返回的是一个n行k列的数组,第i行第j列上的数值是模型预测第i个预测样本的标签为j的概率。此时每一行的和应该等于1。所以,若希望预测结果直接是某预测标签,则用predict,若希望预测结果是标签的概率则用predict_proba。
- 有一点需要注意:SVM模型中输入 roc_auc_score的预测得分由decision_function返回,而不是predict_proba。decision_function(X):返回决策函数值(比如svm中的决策距离),详细情况参照参考5。
3完整代码及注释
#导入包
import pandas as pd
import matplotlib.pyplot as plt
#引入要用到的评价函数
from sklearn.metrics import roc_auc_score
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
from sklearn.metrics import roc_curve,auc
#引入用到的分类算法
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import LinearSVC
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings('ignore')
#读取数据
data_all = pd.read_csv('data_all.csv')
print('数据的行列',data_all.shape)