Python 金融建模:基础与应用
MIT Licensed | Copyright © 2024-present by Yun Liao
Python 应用篇(第13-16章)
第13章:金融风险建模和分析
第14章:效率分析模型(DEA-Malquist模型,SFA模型)
第15章:信用评级和信用评分模型
第16章:资产定价和量化投资模型
第15章:信用评级和信用评分模型
15.1 信用评级模型
信用评级模型是一种数学框架,它使用历史数据和统计技术来评估借款人的信用价值或违约可能性。该模型的输出通常是一个数字分数或字母等级(例如,Aaa、BBB、CCC),反映借款人的信用风险。
信用评级模型的组成部分
信用评级模型通常由三个组成部分组成:
数据:历史数据,包括借款人的过去表现、财务报表和贷款申请。 模型:一种数学框架,使用统计技术来分析数据并预测默认的可能性或信用价值。 得分:该模型的输出是一个数字分数或字母等级,反映借款人的信用风险。
Python 库用于信用评级模型:
Python 成为构建信用评级模型的流行选择,因为它拥有广泛的库和工具。一些用于信用评级模型的 Python 库包括:
Pandas:一个强大的数据处理和分析库。 NumPy:一个高效的数值计算库。 SciPy:一所提供科学计算、优化和信号处理等功能的库。 Scikit-learn:一个机器学习库,包含分类、回归、聚类和更多算法。 Statsmodels:一个统计模型和分析库。
要在 Python 中构建信用评级模型,请遵循以下步骤:
数据准备:收集和预处理数据,从各种来源,如信用报告、财务报表和贷款申请。 特征工程:从数据中提取相关的特征,可以用来训练模型。例如,信用历史、收入、债务-to-income比率和信用利用率。 模型选择:根据数据特性和问题选择合适的机器学习算法。常见的算法包括逻辑回归、决策树、随机森林和神经网络等。 模型训练:使用预处理后的数据训练模型。这一步骤涉及调整模型超参数以优化性能。 模型评估:对训练好的模型进行评估。常见的评估指标包括准确率、精度、召回率和F1分数等。
信用评级模型的应用
信用评级模型在金融机构中有许多应用,包括:
贷款发生:使用信用评级模型确定贷款批准、利率和抵押要求。 投资组合风险管理:监控投资组合的风险并根据需要调整投资策略。 基于风险的定价:根据借款人的信用价值提供个性化的利率和费用。 监管合规性:根据监管要求进行合规性。
信用评级模型是金融机构中一个非常重要的工具,它可以评估借款人的信用价值并帮助确定贷款批准、利率和抵押要求。Python 提供了构建这种模型的强力平台。通过组合数据分析、统计技术和机器学习算法,可以开发一个强壮模型来预测默认的可能性或信用价值。
参考文献
Federal Reserve Bank of Chicago:“Credit Risk Modeling” (2018) International Organization of Securities Commissions (IOSCO):“Guidance on Credit Risk Modeling for Banks” (2019)
15.2 信用评级基线模型: 逻辑回归(LR)和决策树技术(DT)
基线模型提供了一个简单却有效的方式来估计信用风险。它们可以作为更先进的建模技术的起点,例如神经网络或 gradient boosting machines。通过理解这些基线模型的优缺点,我们可以对我们的方法进行调整,以更好地适应特定问题。逻辑回归(LR)基线模型是一个直接、简单且广泛使用的技术来估计信用风险。它基于逻辑回归,计算事件发生给定一组预测变量的概率。
LR 表示方式: 逻辑回归模型可以表示为以下所示: P(default | X)= 1 / (1 + e^(-z)) 其中:
P(default | X)是预测的缺省概率 X 是预测变量向量(例如,信用分数、贷款金额等) z 是预测变量的线性组合 决策树(DT)基线模型是另一个流行的技术。它基于决策树,将数据分区为更小的子集,使用一组规则来确定等级。
决策树模型可以表示为以下所示:
- 使用一个预测变量(例如,信用分数)将数据分割成两个子集
- 计算每个子集中 Gini 系数
- 选择 Gini 系数最高的子集作为最好的分级特征
为什么选择 LR 或 DT? LR 和 DT 都有其优点:
LR 更加可解释,因为它提供了直接的缺省概率估计。 DT 对于异常值和缺失值更加强壮,因为它使用一组规则对数据进行分区。 LR 和 DT 基线模型可以用于多种信用评级评估应用:信用评分:根据一组预测变量估计缺省概率。贷款审批:根据预测的缺省概率确定是否批准或拒绝贷款申请。风险监控:跟踪信用评级组合的信用风险,并根据需要进行调整。
LR 和 DT 基线模型虽然有其优点,但也有一些限制:
- 线性假设: LR 和 DT 都假设预测变量与响应变量(缺省)的线性关系。
- 异常值和噪音: LR 对于数据中的异常值和噪音敏感,而 DT 可能会过拟合。
逻辑回归基线模型
以下是一个逻辑回归基线模型,并不包含数据预处理,模型参数调优等内容:
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 加载数据集
data = pd.read_csv("credit_data.csv")
# 预处理数据
X = data.drop(["credit_rating"], axis=1)
y = data["credit_rating"]
# 编码信用评级标签
le = LabelEncoder()
y_encoded = le.fit_transform(y)
# 将数据拆分为训练和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)
# 创建逻辑回归模型用于多类分类
log_reg = LogisticRegression(max_iter=1000, multi_class="multinomial")
# 在训练数据上训练模型
log_reg.fit(X_train, y_train)
# 对测试数据进行预测
y_pred = log_reg.predict(X_test)
# 使用 accuracy 分数、分类报告和混淆矩阵评估模型
accuracy = accuracy_score(y_test, y_pred)
print("准确性:", accuracy)
print("分类报告:")
print(classification_report(y_test, y_pred))
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))
# 使用模型对新数据进行预测
new_data = pd.DataFrame({"income": [50000], "credit_score": [750], "debt_to_income_ratio": [0.3]})
new_prediction = log_reg.predict(new_data)
print("预测的信用评级:", le.inverse_transform(new_prediction)[0])
# 打印类别标签和它们对应的索引
print("类别标签和它们对应的索引:")
print(le.classes_)
以下是模型的解释:
- 从 CSV 文件加载数据集 using
pd.read_csv. - 预处理数据去除目标变量 (
credit_rating)然后存储于y.X存储特征变量 - 编码信用评级标签
LabelEncoder将信用评级存储为数字变量. - 使用
train_test_split将数据拆分为训练和测试集 - 逻辑回归的参数
multi_class="multinomial"用于多类分类 - 用
fit训练模型 - 我们对测试数据进行预测 using
predict. - 使用 accuracy 分数、分类报告和混淆矩阵评估模型.
- 我们使用模型对新数据进行预测
predict. - 使用
inverse_transform打印预测的信用评级标签
注意:在这个例子中,我们假设信用评级是类别标签(例如:"A"、"B"、"C"等)。如果您的信用评级是数字值(例如:1、2、3 等),可能需要修改编码步骤。请注意,需要将 "credit_data.csv" 替换为自己的数据集文件,并相应地调整列名。此外,您可能还应该使用交叉验证和网格搜索等技术来调优逻辑回归模型的超参数。
决策树基线模型
以下是一个决策树基线模型,并不包含数据预处理,特征工程,模型参数调优等内容:
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 加载数据集
data = pd.read_csv("credit_data.csv")
# 预处理数据
X = data.drop(["credit_rating"], axis=1)
y = data["credit_rating"]
# 编码信用评级标签
le = LabelEncoder()
y_encoded = le.fit_transform(y)
# 将数据拆分为训练和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)
# 创建决策树分类器用于多类分类
dtc = DecisionTreeClassifier(random_state=42)
# 在训练数据上训练模型
dtc.fit(X_train, y_train)
# 对测试数据进行预测
y_pred = dtc.predict(X_test)
# 使用准确性评分、分类报告和混淆矩阵评估模型
accuracy = accuracy_score(y_test, y_pred)
print("准确性:", accuracy)
print("分类报告:")
print(classification_report(y_test, y_pred))
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))
# 使用模型对新数据进行预测
new_data = pd.DataFrame({"income": [50000], "credit_score": [750], "debt_to_income_ratio": [0.3]})
new_prediction = dtc.predict(new_data)
print("预测的信用评级:", le.inverse_transform(new_prediction)[0])
# 打印决策树的特征重要性
importance = dtc.feature_importances_
print("特征重要性:")
for i, feature in enumerate(X.columns):
print(f"{feature}: {importance[i]:.3f}")
# 使用 matplotlib 可视化决策树
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(10, 8))
plot_tree(dtc, filled=True)
plt.title("信用评级决策树")
plt.show()
- 加载数据集并预处理数据。
- 将数据拆分为训练和测试集。
- 创建决策树分类器用于多类分类。
- 在训练数据上训练模型。
- 对测试数据进行预测。
- 使用准确性评分、分类报告和混淆矩阵评估模型。
- 使用模型对新数据进行预测。
- 打印决策树的特征重要性。
- 使用 matplotlib 可视化决策树。
15.3 信用评级其他模型:随机森林、XGBOOST和其他集成模型
以下为使用scikit-learn库实现集成模型(ensemble)的一些简单示例,关于集成模型可参见第10章的介绍
1. 随机森林 随机森林是集成学习方法之一,将多个决策树组合起来,以提高模型的准确性和强壮性。
from sklearn.ensemble import RandomForestClassifier
# 创建随机森林分类器
rfc = RandomForestClassifier(n_estimators=100, random_state=42)
# 在训练数据上训练模型
rfc.fit(X_train, y_train)
# 对测试数据进行预测
y_pred = rfc.predict(X_test)
2. XGBoost XGBoost 是一个流行的梯度boosting框架,可以用于信用评级。
import xgboost as xgb
# 创建 XGBoost 分类器
xgb_cls = xgb.XGBClassifier(objective='multi:softmax', max_depth=6, learning_rate=0.1, n_estimators=100)
# 在训练数据上训练模型
xgb_cls.fit(X_train, y_train)
# 对测试数据进行预测
y_pred = xgb_cls.predict(X_test)
3. 梯度Boosting Machine (GBM) GBM 是另一个流行的梯度boosting框架,可以用于信用评级
from sklearn.ensemble import GradientBoostingClassifier
# 创建 GBM 分类器
gbm = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=6)
# 在训练数据上训练模型
gbm.fit(X_train, y_train)
# 对测试数据进行预测
y_pred = gbm.predict(X_test)
4. 堆积(stacking) 堆积是集成方法之一,将多个基模型的预测结果组合起来,以提高最终模型的准确性。
from sklearn.ensemble import StackingClassifier
# 创建 堆积分类器,带有多个基模型
stacking = StackingClassifier(estimators=[('rfc', RandomForestClassifier(n_estimators=100)),
('xgb', xgb.XGBClassifier(objective='multi:softmax', max_depth=6, learning_rate=0.1, n_estimators=100)),
('gbm', GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=6))])
# 在训练数据上训练模型
stacking.fit(X_train, y_train)
# 对测试数据进行预测
y_pred = stacking.predict(X_test)
5. 投票 投票是集成方法之一,将多个基模型的预测结果组合起来,以提高最终模型的准确性和robustness。
from sklearn.ensemble import VotingClassifier
# 创建 投票分类器,带有多个基模型
voting = VotingClassifier(estimators=[('rfc', RandomForestClassifier(n_estimators=100)),
('xgb', xgb.XGBClassifier(objective='multi:softmax', max_depth=6, learning_rate=0.1, n_estimators=100)),
('gbm', GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=6))])
# 在训练数据上训练模型
voting.fit(X_train, y_train)
# 对测试数据进行预测
y_pred = voting.predict(X_test)
15.4 其他模型:遗传算法模型,深度学习模型
遗传算法模型(Genetic Algorithm)
遗传算法(GA)是一种启发式搜索算法,灵感来自查尔斯·达尔文的进化论。它是一种基于人口的优化技术,使用遗传学和进化原理来搜索最优解决方案。
在信用评级中的应用 在信用评级中,GA 可以用于选择大型数据集中的相关特征或优化机器学习模型的超参数。算法的工作流程如下:
- 初始化 :生成一个随机解的种群(个体)。
- 适应度评价 :评估每个个体的适应度,基于其在预测信用评级中的性能。
- 选择 :选择最适合的个体,以便繁殖和形成下一代。
- 交叉 :两个父代个体交换遗传信息,以创建一个新的子代。
- 变异 :在种群中引入随机变化,以增加多样性。
- 迭代 :重复步骤 2-5,直到达到终止条件(例如,最大生成数)。
实例:使用 GA 进行特征选择 假设我们有一个信用评级数据集,具有 100 个特征,并且想要选择最好的 10 个特征,以预测信用评级。
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectKBest
# 定义适应度函数
def fitness(individual, X, y):
# 评估个体(特征子集)的性能
X_selected = SelectKBest(k=10, score_func=individual).fit_transform(X, y)
clf = RandomForestClassifier(n_estimators=100)
clf.fit(X_selected, y)
return clf.score(X_selected, y)
# 定义遗传算法
def genetic_algorithm(population_size, generations):
population = []
for _ in range(population_size):
individual = np.random.rand(100) # 初始化随机特征子集
population.append(individual)
for generation in range(generations):
fitness_scores = [fitness(individual, X_train, y_train) for individual in population]
fittest_individuals = np.argsort(fitness_scores)[-population_size:]
new_population = []
for _ in range(population_size // 2):
parent1, parent2 = np.random.choice(fittest_individuals, size=2, replace=False)
offspring = crossover(parent1, parent2)
new_population.append(offspring)
population = new_population
return population
# 运行遗传算法
X_train, y_train = ... # 加载您的信用评级数据集
population_size = 100
generations = 50
best_features = genetic_algorithm(population_size, generations)
# 评估最优特征子集的性能
X_selected = SelectKBest(k=10, score_func=best_features[0]).fit_transform(X_train, y_train)
clf = RandomForestClassifier(n_estimators=100)
clf.fit(X_selected, y_train)
print("最优特征子集:", clf.score(X_selected, y_train))
在这个示例中,GA 用于选择最好的 10 个特征,以预测信用评级。适应度函数评估每个个体(特征子集)的性能,使用随机森林分类器。算法迭代地选择最适合的个体,应用交叉和变异操作,并重复直到达到终止条件。
CNN和RNN 评级模型
示例1:使用 CNN 进行信用评级**** 在这个示例中,我们将使用一个卷积神经网络(CNN)从数据中提取特征,然后使用这些特征来预测信用评分。
import pandas as pd
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense, Conv1D, MaxPooling1D
# 样本数据
data = {'age': [25, 30, 35, 20, 28, 32, 29, 34, 26, 31],
'income': [50000, 60000, 70000, 40000, 55000, 65000, 58000, 72000, 52000, 68000],
'credit_history': [1, 1, 0, 1, 0, 1, 1, 0, 1, 0],
'debt_to_income_ratio': [0.2, 0.3, 0.4, 0.1, 0.25, 0.35, 0.28, 0.42, 0.22, 0.38]}
df = pd.DataFrame(data)
# 定义目标变量
target = 'credit_score'
# 将数据分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop(target, axis=1), df[target], test_size=0.2, random_state=42)
# 创建 CNN 模型
model = Sequential()
model.add(Conv1D(kernel_size=3, activation='relu', input_shape=(X_train.shape[1], 1)))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型
model.fit(X_train.values.reshape(-1, X_train.shape[1], 1), y_train, epochs=10, batch_size=32, validation_data=(X_test.values.reshape(-1, X_test.shape[1], 1), y_test))
# 评估模型
loss, accuracy = model.evaluate(X_test.values.reshape(-1, X_test.shape[1], 1), y_test)
print(f'测试准确率:{accuracy:.3f}')
示例2: 使用 RNN 进行信用评级 在这个示例中,我们将使用一个循环神经网络(RNN)来模型数据中的序列依赖关系,然后使用这些依赖关系来预测信用评分。
import pandas as pd
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import LSTM, Dense
# 样本数据
data = {'age': [25, 30, 35, 20, 28, 32, 29, 34, 26, 31],
'income': [50000, 60000, 70000, 40000, 55000, 65000, 58000, 72000, 52000, 68000],
'credit_history': [1, 1, 0, 1, 0, 1, 1, 0, 1, 0],
'debt_to_income_ratio': [0.2, 0.3, 0.4, 0.1, 0.25, 0.35, 0.28, 0.42, 0.22, 0.38]}
df = pd.DataFrame(data)
# 定义目标变量
target = 'credit_score'
# 将数据分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop(target, axis=1), df[target], test_size=0.2, random_state=42)
# 创建 RNN 模型
model = Sequential()
model.add(LSTM(128, input_shape=(X_train.shape[1], 1)))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型
model.fit(X_train.values.reshape(-1, X_train.shape[1], 1), y_train, epochs=10, batch_size=32, validation_data=(X_test.values.reshape(-1, X_test.shape[1], 1), y_test))
# 评估模型
loss, accuracy = model.evaluate(X_test.values.reshape(-1, X_test.shape[1], 1), y_test)
print(f'测试准确率:{accuracy:.3f}')
CNN-LSTM 评级模型
由于一般的评级模型具有静态的特征,如何实现动态(时序)模型进行评级是一个重要的评级模型课题。CNN-LSTM(Convolutional Neural Network - Long Short-Term Memory)评级模型是一种深度学习架构,结合了卷积神经网络(CNN)和长短期记忆(LSTM)网络的优势,以预测评分或分数。
如何工作? CNN-LSTM 评级模型由两个主要组件组成:
- 卷积神经网络(CNN) :CNN 组件负责从输入数据中提取空间特征,例如图像或文本。在评分预测的背景下,CNN 可以用于从用户评论、产品描述或其他类型的非结构化数据中提取特征。
- 长短期记忆(LSTM)网络 :LSTM 组件是一种递归神经网络(RNN),能够学习时间序列数据中的长期依赖关系。在评分预测中,LSTM 可以用于建模用户交互之间的时序关系,例如购买历史或浏览行为。 这两个组件结合形成了一个单一的神经网络,从CNN 和 LSTM 组件中获取输入特征,并输出预测的评分或分数。
以下给出伪代码:
输入形状:(None, 50) (50 个特征)
CNN 组件:
- Conv1D 层:filters=32, kernel_size=3, activation='relu'
- MaxPooling1D 层:pool_size=2
- Flatten 层
LSTM 组件:
- LSTM 层:units=128, return_sequences=True
- Dropout 层:rate=0.2
特征融合层:
- Concatenate 层(CNN 输出 + LSTM 输出)
- Dense 层:units=256, activation='relu'
输出层:
- Dense 层:units=1, activation='sigmoid'
模型配置:
- 优化器:Adam
- 损失函数:均方误差(MSE)
- 批量大小:32
- 时期:20
训练数据 训练数据由 10,000 个样本组成,每个样本代表一个人的金融数据。特征包括:
- 50 个数值特征,如信用分、贷款金额、利率等。
- 20 个序列特征,如付款历史记录和信用卡交易记录。
模型性能 在训练了 20 个时期后,预测的信用级别与实际信用级别高度相关,表明该模型能够捕捉数据中的潜在模式
15.5 信用评分模型
基本概念:
- 信用评分 : 根据个人或企业的信用价值分配数值评分的过程。
- 信用价值: 个人或企业偿还债务和履行财务义务的能力。
- 风险评估 : 评估默认、延迟或其他不良信用事件的可能性。
重要方法:
- 逻辑回归 : 基于一组预测变量预测二元结果(例如,信用批准/拒绝)的统计方法。
- 决策树 : 使用树形模型将个人分类到不同的风险类别的机器学习方法。
- 随机森林 : 将多个决策树组合以提高预测准确性和减少过拟合的ensemble学习方法。
- 神经网络 : 人工神经网络可以学习数据中的复杂模式并根据信用申请进行预测。
- 梯度提升 : 将多个弱模型组合以创建强预测器的机器学习算法。
信用评分模型中使用的关键特征:
- 信用历史记录 : 支付历史记录、信用利用率和其他信用相关数据。
- 人口统计数据 : 年龄、收入、就业状态和其他人口统计特征。
- 财务数据 : 收入、支出、债务与收入比率和其他财务指标。
- 行为数据 : 信用卡交易记录、贷款支付记录和其他行为模式。
模型评估度量:
- 准确性 : 正确预测的比例(例如,批准/拒绝贷款)。
- 精准率 : 在所有正预测中正确批准贷款的比例。
- 召回率 : 在所有实际正实例中正确批准贷款的比例。
- F1分数 : 精准率和召回率的平衡度量。
- AUC-ROC : 接收器操作特征曲线下的面积,衡量模型在区别不同风险类别方面的性能。
信用评分与信用评级的不同点
信用评分和信用评级是信用风险评估领域中的两个不同概念。下面是它们之间的区别:
1. 目的:
- 信用评分 :根据个体或组织的信用历史、财务行为和其他因素,为其分配一个数字分数,以预测偿还可能性。
- 信用评级 :为发行人提供一份定性评估,通常以字母等级形式(例如AAA、BBB、CCC),表明与借贷或投资相关的风险水平。
2. 输出:
- 信用评分 :生成一个数字分数,通常在300到850之间,可以用来将借款人分类为不同风险等级。
- 信用评级 :分配一个字母等级或评级,例如AAA(非常低风险)到D(非常高风险),表明发行人的信用价值。
3. 焦点:
- 信用评分 :主要关注个体借款人的信用行为和财务状况。
- 信用评级 :评价整个组织的信用价值,考虑因素如业务运营、管理团队、行业趋势和宏观经济条件。
4. 应用:
- 信用评分 :广泛应用于个人借贷(例如信用卡、个人贷款、抵押贷款)中,以确定贷款资格、利率和信用额度。
- 信用评级 :常用于公司金融、债券发行和投资分析中,以评价公司和政府的信用质量。
5. 方法论:
- 信用评分 :通常使用机器学习算法、统计模型或决策树来分析借款人的信用数据,并生成一个分数。
- 信用评级 :经常涉及到信用评级机构(例如穆迪、标准普尔)的主观、定性评估,对发行人的信用profile进行评价基于各种标准。
总之,虽然信用评分和信用评级都是为了评估信用风险,但它们之间存在目的、输出、焦点、应用和方法论等方面的区别。
信用评分中的分箱(bin)
在信用评分中,分箱是一种将连续变量分类到离散组或间隔的方法。分箱的目的是:
- 降低维度 :将高维数据转换为低维表示。
- 提高模型可解释性 :使模型之间的关系更易于理解。
- 提高模型性能 :通过将相似值组合在一起,分箱可以提高模型的预测能力。
分箱类型 :
- 等宽分箱 :将变量的范围分成等大小的间隔。
- 等频率分箱 :将变量的范围分成具有大致相同数量观察值的间隔。
- 优化分箱 :使用算法来找到使模型性能最大化或损失最小化的分箱边界。
常见的分箱技术 :
- 分位数分箱 :将变量的范围根据分位数(例如四分位、十分位)分成间隔。
- K-Means聚类 :使用K-Means聚类来组合相似值。
- 决策树 :使用决策树递归地划分数据,创建分箱。
信用评分模型中的分箱 :
- 信用分数分箱 :将信用分数分类到离散组(例如300-500、501-700)。
- 变量分箱 :将单个变量(例如收入、债务与收入比率)分箱以创建模型的特征。
- 细分 :根据客户或账户的特征(例如年龄、信用记录)进行分箱。
信用评分中的分箱优点 :
- 提高模型性能 :分箱可以帮助模型更好地捕捉非线性关系和变量之间的交互。
- 提高可解释性 :分箱使得模型之间的关系更易于理解。
- 加速模型开发 :分箱可以减少数据的维度,使得模型开发和训练更快。
然而,分箱也存在一些限制和潜在的缺陷,如:
- 信息损失 :分箱可能会导致信息的损失,特别是当分箱太粗糙时。
- 任意分箱边界 :分箱边界的选择可能是任意的,并且不一定反映变量之间的潜在关系。
- 过拟合 :模型可能会过拟合到分箱数据,从而导致泛化性能不佳。
通过小心考虑分箱的优点和限制,可以开发出信用评分模型,平衡模型性能、可解释性和简洁性。
信用评分的基础示例
在这个示例中,我们将使用以下变量来预测信用评分:
- age:个人的年龄
- income:个人的收入
- credit_history:一个二进制变量,表示个人的信用历史是否良好(1)或不良好(0)
- debt_to_income_ratio:个人的债务与收入之比
数据
我们将使用一个样本数据集来训练和测试我们的模型。该数据集包含 100 个观测,每个观测都具有上述四个变量。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
# 样本数据
data = {'age': [25, 30, 35, 20, 28, 32, 29, 34, 26, 31],
'income': [50000, 60000, 70000, 40000, 55000, 65000, 58000, 72000, 52000, 68000],
'credit_history': [1, 1, 0, 1, 0, 1, 1, 0, 1, 0],
'debt_to_income_ratio': [0.2, 0.3, 0.4, 0.1, 0.25, 0.35, 0.28, 0.42, 0.22, 0.38]}
df = pd.DataFrame(data)
# 定义目标变量
target = 'credit_score'
# 将数据分割成训练和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop(target, axis=1), df[target], test_size=0.2, random_state=42)
训练和输出
# Train a logistic regression model
model = LogisticRegression()
model.fit(X_train, y_train)
# Make predictions on the testing set
y_pred = model.predict(X_test)
# Evaluate the model
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.3f}')
report = classification_report(y_test, y_pred)
print(f'Classification Report:\n{report}')
def credit_score(age, income, credit_history, debt_to_income_ratio):
# Create a dataframe with the input variables
input_data = pd.DataFrame({'age': [age], 'income': [income], 'credit_history': [credit_history], 'debt_to_income_ratio': [debt_to_income_ratio]})
# Make predictions using the trained model
prediction = model.predict(input_data)
# Return the predicted credit score
return prediction[0]
age = 29
income = 58000
credit_history = 1
debt_to_income_ratio = 0.28
predicted_credit_score = credit_score(age, income, credit_history, debt_to_income_ratio)
print(f'Predicted Credit Score: {predicted_credit_score:.3f}')
15.6 练习
以下练习4选1(团队任务) 成绩根据打榜排位计分,每只队伍不多于三人。以团队形式提交。
赛道1
https://tianchi.aliyun.com/competition/entrance/231784/rankingList 车市先知:二手车价格预测学习赛 二手车价格收到多种因素影响,在现有的数据集下,我们如何通过机器学习的方式去预测它的价格呢? 赛题以二手车市场为背景,要求选手预测二手汽车的交易价格,这是一个典型的回归问题。该赛题引导大家走进AI数据竞赛的世界,主要针对于于竞赛新人进行自我练习、自我提高。 通过对本方案的完整学习,可以帮助同学们掌握数据分析基本技能。
赛道2
https://tianchi.aliyun.com/competition/entrance/531830/rankingList 金融守护者:金融风险预测学习赛 如果你是银行的业务员,如何判断一笔贷款的风险呢? 如果让AI来判断,该怎么做呢? 赛题以金融风控中的个人信贷为背景,要求选手根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这是一个典型的分类问题。通过这道赛题来引导大家了解金融风控中的一些业务背景,解决实际问题,帮助竞赛新人进行自我练习、自我提高。
赛道3
https://tianchi.aliyun.com/competition/entrance/532421/rankingList 赛道六-评论观点挖掘赛 在天池平台十余年的发展历程中,积累了多个基于阿里巴巴集团实际业务场景的数据集资源,这些珍贵的数据集极具商业与学术价值。本系列赛事由天池团队升级打造,回顾经典电商类赛事,重装上阵,在这里用海量真实数据练手,让代码在真实战场上奔跑!品多种真实业务场景,触摸数据背后的用户心跳!
赛道4
https://tianchi.aliyun.com/competition/entrance/532417/rankingList 赛道二-天猫复购预测赛 在天池平台十余年的发展历程中,积累了多个基于阿里巴巴集团实际业务场景的数据集资源,这些珍贵的数据集极具商业与学术价值。本系列赛事由天池团队升级打造,回顾经典电商类赛事,重装上阵,在这里用海量真实数据练手,让代码在真实战场上奔跑!品多种真实业务场景,触摸数据背后的用户心跳!
:::
MIT Licensed | Copyright © 2024-present by Yun Liao :::