PYTHON机器学习——二元Logistic回归算法实战:从数据预处理到模型评估
背景
数据5.1”文件中的内容是XX银行XX省分行的700个对公授信客户的信息数据。这700个对公授信客户是以前曾获得贷款的客户,包括存量授信客户和已结清贷款客户。
在数据文件中共有9个变量,V1~V9分别代表“征信违约记录”“资产负债率”“行业分类”“实际控制人从业年限”“企业经营年限”“主营业务收入”“利息保障倍数”“银行负债”“其他渠道负债”。
针对V1(征信违约记录),分别用0、1来表示未违约、违约。针对V3(行业分类),分别用1、2、3、4、5来表示“制造业”“批发零售业”“建筑业、房地产与基础设施”“科教文卫”“农林牧渔业”。
一、环境准备与数据导入
首先,让我们导入必要的库:
# 导入数据处理和分析所需的基础库
import numpy as np # 用于数值计算
import pandas as pd # 用于数据处理和分析
import seaborn as sns # 用于数据可视化
import matplotlib.pyplot as plt # 用于绘图
from warnings import simplefilter # 用于警告控制
# 导入机器学习相关库
from sklearn.linear_model import LogisticRegression # 逻辑回归模型
from sklearn.model_selection import train_test_split # 数据集分割
from sklearn import metrics # 模型评估指标
from sklearn.metrics import cohen_kappa_score # Cohen's Kappa评分
# 忽略未来警告
simplefilter(action='ignore', category=FutureWarning)
二、数据加载与探索性分析
# 读取数据
data = pd.read_csv('数据5.1.csv')
# 查看数据基本信息
data.info() # 显示数据集的基本信息
data.shape # 查看数据集的维度
data.dtypes # 查看各列的数据类型
data.isnull().sum() # 检查缺失值
# 描述性统计分析
print(data.describe()) # 显示数值型变量的统计描述
# 按V1变量分组统计
data.groupby('V1').describe().unstack() # 分组描述性统计
# 交叉表分析
pd.crosstab(data.V3, data.V1) # 计算V3和V1的交叉表
pd.crosstab(data.V3, data.V1, normalize='index') # 计算比例
三、数据可视化分析
# 相关性热图
plt.figure(figsize=(10, 6)) # 设置图形大小
sns.heatmap(data.corr(), annot=True) # 绘制相关性热图
plt.show()
# 变量关系可视化
sns.pairplot(data) # 绘制变量间的散点图矩阵
plt.show()
# 箱线图
plt.figure(figsize=(20, 10)) # 设置图形大小
sns.boxplot(data=data) # 绘制箱线图
plt.show()



四、数据预处理
# 定义数据编码函数
defdata_encoding(data):
# 选择需要的特征
data = data[["V1", 'V2', "V3", "V4", "V5", "V6", "V7", "V8", "V9"]]
# 区分离散特征和连续特征
Discretefeature = ["V3"] # 离散特征
Continuousfeature = ['V2', "V4", "V5", "V6", "V7", "V8", "V9"] # 连续特征
# 对离散特征进行独热编码
df = pd.get_dummies(data, columns=Discretefeature)
# 对连续特征进行标准化
df[Continuousfeature] = (df[Continuousfeature] - df[Continuousfeature].mean()) / (df[Continuousfeature].std())
# 保留目标变量
df["V1"] = data[["V1"]]
return df
# 数据编码处理
data = data_encoding(data)
五、模型训练与评估
# 准备训练数据
X = data.drop(['V1', 'V3_5'], axis=1) # 特征变量
X['intercept'] = [1] * X.shape[0] # 添加截距项
y = data['V1'] # 目标变量
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3, random_state=100)
# 建立和训练模型
model = LogisticRegression(C=1e10, fit_intercept=True)
model.fit(X_train, y_train)
# 模型评估
print("训练集准确率:", model.score(X_train, y_train))
print("测试集准确率:", model.score(X_test, y_test))
# 生成预测结果
predict_target = model.predict(X_test)
predict_target_prob = model.predict_proba(X_test)
六、特征重要性分析
# 提取特征重要性
lr1 = [i for item in model.coef_ for i in item]
feature = list(X.columns)
dic = dict(zip(feature, lr1))
# 可视化特征重要性
df = pd.DataFrame.from_dict(dic, orient='index', columns=['权重'])
df = df.reset_index().rename(columns={'index': '特征'})
df = df.sort_values(by='权重', ascending=False)
# 绘制特征重要性条形图
plt.figure(figsize=(6, 6))
plt.barh(range(len(df['特征'])), df['权重'], color='#6699CC')
plt.yticks(range(len(df['特征'])), df['特征'], fontsize=12)
plt.xlabel('Feature importance', fontsize=14)
plt.title("LR feature importance analysis", fontsize=14)
plt.show()

七、模型评估指标
# 计算Cohen's Kappa系数
print("Cohen's Kappa:", cohen_kappa_score(y_test, predict_target))
# 绘制ROC曲线
RocCurveDisplay.from_estimator(model, X_test, y_test)
plt.plot([0, 1], [0, 1], linestyle='--', color='gray')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()

总结
通过这个完整的示例,我们展示了二元Logistic回归分析的完整流程,从数据预处理到模型训练评估。每个步骤都配有详细的代码注释,帮助读者更好地理解实现过程。这个案例可以作为实际工作中进行二元分类问题分析的参考模板。
THE END