机器学习的分类问题常用评论指标有:准确率、精确度、召回率和F1值,还有kappa指标 。
每次调包去找他们的计算代码很麻烦,所以这里一次性定义一个函数,直接计算所有的评价指标。
每次输入预测值和真实值就可以得到上面的指标值,很方便。
下面是这些指标的计算公式:
kappa指标:
Python计算代码
下面是定义函数:(主要也是借助sklearn库)
#导入数据分析常用包import numpy as np import pandas as pd from sklearn.metrics import confusion_matrixfrom sklearn.metrics import classification_reportfrom sklearn.metrics import cohen_kappa_scoredef evaluation(y_test, y_predict): accuracy=classification_report(y_test, y_predict,output_dict=True)['accuracy'] s=classification_report(y_test, y_predict,output_dict=True)['weighted avg'] precision=s['precision'] recall=s['recall'] f1_score=s['f1-score'] #kappa=cohen_kappa_score(y_test, y_predict) return accuracy,precision,recall,f1_score #, kappa
这个函数就两个参数,真实值和预测值,放入就可以计算上面的所有指标了,函数的返回值就是accuracy,precision,recall,f1_score #, kappa。
kappa我注释掉了,要用的话拿出来就行。
画图展示:
比如我们已经准备好了特征变量X和响应变量y。
下面划分测试集和训练集:
#划分训练集和测试集from sklearn.model_selection import train_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,stratify=y,test_size=0.2,random_state=0)
标准化一下:
#数据标准化from sklearn.preprocessing import StandardScalerscaler = StandardScaler()scaler.fit(X_train)X_train_s = scaler.transform(X_train)X_test_s = scaler.transform(X_test)print('训练数据形状:')print(X_train_s.shape,y_train.shape)print('验证集数据形状:')print(X_test_s.shape,y_test.shape)
弄十个机器学习模型对比:
from sklearn.linear_model import LogisticRegressionfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysisfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.ensemble import GradientBoostingClassifierfrom xgboost.sklearn import XGBClassifierfrom lightgbm import LGBMClassifierfrom sklearn.svm import SVCfrom sklearn.neural_network import MLPClassifier
实例化分类器:
#逻辑回归model1 = LogisticRegression(C=1e10,max_iter=10000)#线性判别分析model2 = LinearDiscriminantAnalysis()#K近邻model3 = KNeighborsClassifier(n_neighbors=10)#决策树model4 = DecisionTreeClassifier(random_state=77)#随机森林model5= RandomForestClassifier(n_estimators=1000, max_features='sqrt',random_state=10)#梯度提升model6 = GradientBoostingClassifier(random_state=123)#极端梯度提升model7 = XGBClassifier(use_label_encoder=False,eval_metric=['logloss','auc','error'], objective='multi:softmax',random_state=0)#轻量梯度提升model8 = LGBMClassifier(objective='multiclass',num_class=3,random_state=1)#支持向量机model9 = SVC(kernel="rbf", random_state=77)#神经网络model10 = MLPClassifier(hidden_layer_sizes=(16,8), random_state=77, max_iter=10000)model_list=[model1,model2,model3,model4,model5,model6,model7,model8,model9,model10]model_name=['逻辑回归','线性判别','K近邻','决策树','随机森林','梯度提升','极端梯度提升','轻量梯度提升','支持向量机','神经网络']
计算评价指标:用df_eval数据框装起来计算的评价指标数值
df_eval=pd.DataFrame(columns=['Accuracy','Precision','Recall','F1_score'])for i in range(10): model_C=model_list[i] name=model_name[i] model_C.fit(X_train_s, y_train) pred=model_C.predict(X_test_s) #s=classification_report(y_test, pred) s=evaluation(y_test,pred) df_eval.loc[name,:]=list(s)
查看
df_eval
画对应的柱状图:
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['KaiTi'] #中文plt.rcParams['axes.unicode_minus'] = False #负号bar_width = 0.4colors=['c', 'b', 'g', 'tomato', 'm', 'y', 'lime', 'k','orange','pink','grey','tan']fig, ax = plt.subplots(2,2,figsize=(10,8),dpi=128)for i,col in enumerate(df_eval.columns): n=int(str('22')+str(i+1)) plt.subplot(n) df_col=df_eval[col] m =np.arange(len(df_col)) plt.bar(x=m,height=df_col.to_numpy(),width=bar_width,color=colors) #plt.xlabel('Methods',fontsize=12) names=df_col.index plt.xticks(range(len(df_col)),names,fontsize=10) plt.xticks(rotation=40) plt.ylabel(col,fontsize=14) plt.tight_layout()#plt.savefig('柱状图.jpg',dpi=512)plt.show()
四个评价指标,对应的十种模型进行对比。
这个自定义计算分类评价指标函数还是很方便的,还可以用于交叉验证里面,全面评价模型的预测好坏程度。
来源地址:https://blog.csdn.net/weixin_46277779/article/details/129338660