机器学习建模与评估
知识点:
今日代码比较多,但是难度不大,仔细看看示例代码,好好理解下这几个评估指标。
作业:尝试对心脏病数据集采用机器学习模型建模和评估
先回顾一下对于一个数据进行机器学习训练的全流程:
1. 导入库和读取数据查看数据信息----理解数据,可视化也包含在里
2. 缺失值处理----fillna()
3. 异常值处理----根据箱线图等方法可以检测异常值,处不处理看情况,这里没有要求
4. 离散值处理----标签编码map()+独热编码get_dummies()
(PS:一来说都是离散变量都是先处理缺失值再进行编码,这里的离散变量都是'object',先进行编码转换成数值型再一并处理缺失值,偷个懒,其实从数据准确性上来说有点问题)
5.特征缩放----就是对连续变量进行标准化或者归一化
6. 删除无用列
7. 划分数据集
8. 特征工程----根据已有特征创建新的特征,可能会对模型性能有提升;或者通过相关性分析等方法,去除与目标变量相关性较低或冗余的特征,以降低模型的复杂度和过拟合的风险,这里也没要求
9. 模型训练
10. 模型评估
11. 模型保存
12. 模型预测
数据集划分前面的部分不赘述了,复习巩固一下
要点:
1、从数据集里删除标签把特征变量剥脱出来,data.drop(['Credit Default'])这样写不能直接删除列,会报错。原因是drop方法默认是按行删除,传入一个标签'Credit Default'时,它会尝试在索引中查找该标签并删除对应的行,但数据中不存在名为'Credit Default'的行索引,就会导致报错。
2、test_size=0.2:测试集占总数据的20%,总共7500样本,算下来测试机应该为6000
3、random_state=42:随机种子,确保每次划分结果相同
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X = data.drop(['Credit Default'], axis=1) # 特征,axis=1表示按列删除,axis=0表示按行删除
y = data['Credit Default'] # 标签
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 划分数据集,20%作为测试集,随机种子为42
# 训练集和测试集的形状
print(f"训练集形状: {X_train.shape}, 测试集形状: {X_test.shape}") # 打印训练集和测试集的形状
训练集形状: (6000, 31), 测试集形状: (1500, 31)
训练很简单,导入相应模型之后就只有经典三行代码:
1. 模型实例化
2. 模型训练(代入训练集)
3. 模型预测 (代入测试集)
对于评估,测试集的预测值和测试集的真实值进行对比,得到混淆矩阵,基于混淆矩阵计算准确率、召回率、F1值,这些都是固定阈值的评估指标。AUC是基于不同阈值得到不同的混淆矩阵,然后计算每个阈值对应FPR和TPR,将这些点连成线,最后求曲线下的面积,得到AUC值
导入机器学习模型:
from sklearn.svm import SVC #支持向量机分类器
from sklearn.neighbors import KNeighborsClassifier #K近邻分类器
from sklearn.linear_model import LogisticRegression #逻辑回归分类器
import xgboost as xgb #XGBoost分类器
import lightgbm as lgb #LightGBM分类器
from sklearn.ensemble import RandomForestClassifier #随机森林分类器
from catboost import CatBoostClassifier #CatBoost分类器
from sklearn.tree import DecisionTreeClassifier #决策树分类器
from sklearn.naive_bayes import GaussianNB #高斯朴素贝叶斯分类器
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标
from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵
import warnings #用于忽略警告信息
warnings.filterwarnings("ignore") # 忽略所有警告信息
分别训练和计算评估指标,就以三个模型为例:
要点:
1、实例化传入的参数是随机种子,调用模型的 fit() 方法进行训练,最后用模型的 predict() 函数进行预测。KNN 和朴素贝叶斯模型不用随机种子,是因为这两个模型的训练和预测过程不涉及随机操作,跟模型原理有关
2、评估指标的几个函数并非是模型对象(例如svm_model)的方法,而是sklearn.metrics模块里的一个独立函数,设计初衷就是为了通用而非以来特定模型对象
###### SVM ######
svm_model = SVC(random_state=42) # 实例化
svm_model.fit(X_train, y_train) # 训练
svm_pred = svm_model.predict(X_test) # 预测
# 以上就是经典三行代码
print("\nSVM 分类报告:")
print(classification_report(y_test, svm_pred)) # 打印分类报告,它会生成所有类别的指标
print("SVM 混淆矩阵:")
print(confusion_matrix(y_test, svm_pred)) # 打印混淆矩阵
# 计算 SVM 评估指标,这些指标默认计算正类的性能
svm_accuracy = accuracy_score(y_test, svm_pred)
svm_precision = precision_score(y_test, svm_pred)
svm_recall = recall_score(y_test, svm_pred)
svm_f1 = f1_score(y_test, svm_pred)
print("SVM 模型评估指标:")
print(f"准确率: {svm_accuracy:.4f}")
print(f"精确率: {svm_precision:.4f}")
print(f"召回率: {svm_recall:.4f}")
print(f"F1 值: {svm_f1:.4f}")
###### KNN ######
knn_model = KNeighborsClassifier()
knn_model.fit(X_train, y_train)
knn_pred = knn_model.predict(X_test)
print("\nKNN 分类报告:")
print(classification_report(y_test, knn_pred))
print("KNN 混淆矩阵:")
print(confusion_matrix(y_test, knn_pred))
knn_accuracy = accuracy_score(y_test, knn_pred)
knn_precision = precision_score(y_test, knn_pred)
knn_recall = recall_score(y_test, knn_pred)
knn_f1 = f1_score(y_test, knn_pred)
print("KNN 模型评估指标:")
print(f"准确率: {knn_accuracy:.4f}")
print(f"精确率: {knn_precision:.4f}")
print(f"召回率: {knn_recall:.4f}")
print(f"F1 值: {knn_f1:.4f}")
###### 逻辑回归 ######
logreg_model = LogisticRegression(random_state=42)
logreg_model.fit(X_train, y_train)
logreg_pred = logreg_model.predict(X_test)
print("\n逻辑回归 分类报告:")
print(classification_report(y_test, logreg_pred))
print("逻辑回归 混淆矩阵:")
print(confusion_matrix(y_test, logreg_pred))
logreg_accuracy = accuracy_score(y_test, logreg_pred)
logreg_precision = precision_score(y_test, logreg_pred)
logreg_recall = recall_score(y_test, logreg_pred)
logreg_f1 = f1_score(y_test, logreg_pred)
print("逻辑回归 模型评估指标:")
print(f"准确率: {logreg_accuracy:.4f}")
print(f"精确率: {logreg_precision:.4f}")
print(f"召回率: {logreg_recall:.4f}")
print(f"F1 值: {logreg_f1:.4f}")
对比一下就会发现,调用不同模型进行训练和之后的评估指标计算,代码没什么太大不同,堪称模板,这不很好记吗
@浙大疏锦行