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