@浙大疏锦行
知识点:
- 把之前所有的处理手段都处理一遍,回顾一下全流程,以后就用处理好的部分直接完成
- 开始机器学习建模(简单建模,不涉及调参)和评估
一、数据的处理
1.1 导入所需要的包
1.2 查看数据信息
1.3 特征名映射
1.4 删除无用列
1.5 编码映射
1.6 填补缺失值
1.7 异常值处理
1.8 可视化分析
1.9 其他核心部分
特征工程
- 衍生新特征:根据已有特征创建新的特征,可能会对模型性能有提升。例如,可以计算“Debt - to - Income Ratio”(负债收入比),即“Monthly Debt”与“Annual Income”的比值,来反映客户的债务负担情况。
- 特征选择:通过相关性分析等方法,选择与目标变量“Credit Default”相关性较高的特征,去除相关性较低或冗余的特征,以降低模型的复杂度和过拟合的风险。
此外,数据不平衡输出我们后面再说
此时你可能会好奇,怎么还没有归一化/标准化?这就需要我们引入数据泄露的观点了
我们之所以推迟归一化或标准化步骤,正是为了避免关键的训练集/测试集数据泄露问题。一旦在划分数据集之前对全集应用此类预处理,训练过程就间接利用了测试集的均值和标准差等统计信息,这会导致对模型在未知数据上性能的乐观估计。课上反复提及的核心:
考试理论:
- 不要提前知道考试题。
- 调参就需要考2次
二、机器学习模型建模
2.1 数据划分
2.2 数据归一化
只需要对连续特征归一化即可,离散特征编码后虽然是数值,但是不用动
from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, MinMaxScaler # ---------------------------------------------------------------------- # 定义连续特征列 (需要归一化的特征) # ---------------------------------------------------------------------- continuous_features = [ '年收入', '当前工作年限', '开放账户数量', # 虽为计数,但一般也进行缩放 '信用历史年限', '最大开放信用额度', '距上次拖欠月数', '当前贷款金额', '当前信用余额', '月债务', '信用评分' ] # 初始化归一化器 (MinMaxScaler) scaler = MinMaxScaler() # 仅在训练集上 fit (学习最大值和最小值) # 然后对训练集进行 transform (应用缩放) # 注意:Scikit-learn 返回 NumPy 数组,需要重新赋值给 DataFrame X_train[continuous_features] = scaler.fit_transform(X_train[continuous_features]) # 使用训练集学到的参数 (scaler) 直接对测试集进行 transform # 绝对不能对测试集使用 fit_transform() X_test[continuous_features] = scaler.transform(X_test[continuous_features]) X_test2.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") # 忽略所有警告信息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}")classification_report它会生成所有类别的指标
准确率(Accuracy)是一个全局指标,衡量所有类别预测正确的比例 (TP + TN) / (TP + TN + FP + FN)。它不区分正负类,所以它只有一个值,不区分类别
单独调用的 precision_score, recall_score, f1_score 在二分类中默认只计算正类(标签 1)的性能。由于模型从未成功预测出类别 1(TP=0),所以这些指标对类别 1 来说都是 0。
# 逻辑回归 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}")我们来解读一下这个输出的表格,看看能看出来哪些信息?
- Precision (精确率) 在所有模型预测为该类别的样本中,真正属于该类别的比例。
- Recall (召回率) 在所有真正属于该类别的样本中,被模型正确识别的比例。
因此,分类报告必须给出 0 和 1 的详细指标,以便了解模型在预测两种不同结果时的偏向和能力差异。
准确率 (Accuracy): 这是整体指标,计算的是 (TP+TN)/Total,与 0 或 1 无关,所以只有一个总值。
在二分类问题中,Scikit-learn 的评估函数(如 precision_score, recall_score, f1_score)在默认情况下,会将标签 1 视为重点关注的正类来计算指标。
此外,support(样本数)显示,类别 0 有 997 个样本,而类别 1 只有 400 个样本。这是一个不平衡数据集。逻辑回归模型严重偏向于预测类别 0(未违约),模型在预测 1(违约)时很“谨慎”(高 Precision: 0.89),但它错过了大量真正的违约者(低 Recall: 0.28)。
- 精确率关注的是“误报”(False Positive)——即把非违约客户错判为违约客户的错误。预测为违约的客户中有 89.43% 是正确的。误报率低。
- 召回率关注的是“漏报”(False Negative)——即把真正违约的客户错判为未违约客户的错误。模型只识别出了所有真正违约客户中的 27.50%。漏报率极高。
其他类似的和上面一样输出