导入包,并对数据集进行处理
import pandas as pd
from sklearn.metrics import precision_score,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.preprocessing import StandardScaler
import matplotlib.pyplot as plt
data_all=pd.read_csv(r'C:\Users\lxy\Desktop\input\data_all.csv')
from sklearn.model_selection import train_test_split
features=[x for x in data_all.columns if x not in ['status']]
x=data_all[features]
y=data_all['status']
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=2018)
scaler = StandardScaler()
scaler.fit(x_train)
x_train= scaler.transform(x_train)
x_test= scaler.transform(x_test)
评分函数
def scores(model,x_train,y_train,x_test,y_test):
model_score=model.fit(x_train,y_train)
test_predict=model_score.predict(x_test)
if hasattr(model,'decision_function'):
pre_test=model_score.decision_function(x_test)
else:
pre_test=model_score.predict_proba(x_test)[:,1]
print("准确率",accuracy_score(y_test,test_predict))
print("精确率",precision_score(y_test,test_predict))
print("召回率",recall_score(y_test,test_predict))
print("F1-score",f1_score(y_test,test_predict))
print("AUC",roc_auc_score(y_test,pre_test))
false_positive_rate,true_positive_rate,thresholds=roc_curve(y_test,pre_test)
roc_auc=auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate, true_positive_rate,'b',label='AUC = %0.4f'% roc_auc)
plt.legend(loc='lower right')
plt.plot([0,1],[0,1],'r--')
plt.ylabel('TPR')
plt.xlabel('FPR')
逻辑回归
from sklearn.linear_model import LogisticRegression
lr =LogisticRegression(random_state=2018)
lr.fit(x_train,y_train)
scores(lr,x_train,y_train,x_test,y_test)
准确率 0.7876664330763841
精确率 0.6609195402298851
召回率 0.3203342618384401
F1-score 0.4315196998123827
AUC 0.7657428562486308
svm
from sklearn.svm import LinearSVC
svm=LinearSVC(random_state=2018)
scores(svm,x_train,y_train,x_test,y_test)
准确率 0.7813594954449895
精确率 0.6535947712418301
召回率 0.2785515320334262
F1-score 0.390625
AUC 0.7677954784931093
决策树
from sklearn.tree import DecisionTreeClassifier
tree=DecisionTreeClassifier(random_state=2018)
scores(tree,x_train,y_train,x_test,y_test)
准确率 0.6846531184302733
精确率 0.38242894056847543
召回率 0.41225626740947074
F1-score 0.3967828418230563
AUC 0.5942367479369453
随机森林
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=500,oob_score=True, random_state=2018)
scores(rf,x_train,y_train,x_test,y_test)
准确率 0.7841625788367204
精确率 0.6888888888888889
召回率 0.2590529247910863
F1-score 0.3765182186234817
AUC 0.760757357620523
GBDT
from sklearn.ensemble import GradientBoostingClassifier
gbdt=GradientBoostingClassifier(random_state=2018)
scores(gbdt,x_train,y_train,x_test,y_test)
准确率 0.7806587245970568
精确率 0.6116504854368932
召回率 0.35097493036211697
F1-score 0.44601769911504424
AUC 0.763794560420644
lightgbm
import lightgbm as lgb
lgb_model = lgb.LGBMClassifier(boosting_type='GBDT',random_state=2018)
scores(lgb_model,x_train,y_train,x_test,y_test)
准确率 0.7701471618780659
精确率 0.5701357466063348
召回率 0.35097493036211697
F1-score 0.43448275862068964
AUC 0.7574019592501017
xgboost
from xgboost.sklearn import XGBClassifier
xgbc = XGBClassifier(random_state=2018)
scores(xgbc,x_train,y_train,x_test,y_test)
准确率 0.7855641205325858
精确率 0.6305418719211823
召回率 0.3565459610027855
F1-score 0.4555160142348754
AUC 0.7713634419371329
代码中的一些学习内容:
1.roc_curve详解
在sklearn中,sklearn.metrics.roc_curve() 函数用于绘制ROC曲线。但是对于例子中如何得到返回值产生了疑惑,现在对于返回值的计算做一点解释。
主要参数:
y_true:真实的样本标签,默认为{0,1}或者{-1,1}。如果要设置为其它值,则 pos_label 参数要设置为特定值。例如要令样本标签为{1,2},其中2表示正样本,则pos_label=2。
y_score:对每个样本的预测结果。
pos_label:正样本的标签。
返回值的计算:
fpr:False positive rate。
tpr:True positive rate。
thresholds 阀值
2.数据没有归一化,结果lr和svm都跑不出来:
这里给出一点看法是:线性模型是否归一化直接影响模型的收敛,下面看图这是归一化后模型收敛可以看出相对平滑,迅速准确收敛
这是未归一化的,收敛曲折,有时还没收敛就终止了。所以试试把lr的阀值改为1e-6时,模型就收敛结果就正确了
许多学习算法中目标函数的基础例如(SVM的RBF内核或线性模型的l1和l2正则化)都是假设所有的特征都是零均值并且具有同一阶数上的方差。如果某个特征的方差比其他特征大几个数量级,那么它就会在学习算法中占据主导位置,导致学习器并不能像我们说期望的那样,从其他特征中学习。
逻辑回归如果你不用正则,那么,标准化并不是必须的,如果你用正则,那么标准化是必须的。为什么呢?因为不用正则时,我们的损失函数只是仅仅在度量预测与真实的差距,加上正则后,我们的损失函数除了要度量上面的差距外,还要度量参数值是否足够小
3.评分
准确率(accuracy): (TP + TN )/( TP + FP + TN + FN)
精准率(precision):TP / (TP + FP),正确预测为正占全部预测为正的比例
召回率(recall): TP / (TP + FN),正确预测为正占全部正样本的比例
F-measure(f1-score):precision和recall调和均值的2倍。