toad
是一个Python库,用于数据预处理和特征工程,特别是在金融风控和信用评分建模中应用广泛。
以下是 toad
库中主要函数的详细说明,包括它们的参数和作用:
数据转换与预处理
1. toad.transformer.WOETransformer
作用:将分类变量转换为WOE(Weight of Evidence)值,以便更好地用于模型训练。
参数:
exclude
: list, 默认值为空列表。需要排除在外的列。min_samples
: int, 默认值为0。每个分箱中的最小样本数。n_bins
: int, 默认值为10。每个变量的分箱数量。woe
: dict, 默认值为None。预定义的WOE字典。
woe = toad.transformer.WOETransformer()
data_woe = woe.fit_transform(data, target='default')
2. toad.transformer.Fillna
作用:填补缺失值。
参数:
value
: dict or scalar, 默认值为None。填补缺失值的策略或具体值。
fillna = toad.transformer.Fillna(value=0)
data_filled = fillna.fit_transform(data)
3. toad.transformer.TargetEncoder
作用:目标编码器,用于将分类变量编码为目标变量的平均值。
参数:
cols
: list, 默认值为空列表。需要编码的列。target
: str。目标列的名称。min_samples
: int, 默认值为1。每个类别的最小样本数。
target_encoder = toad.transformer.TargetEncoder(cols=['categorical_col'], target='default')
data_encoded = target_encoder.fit_transform(data)
4. toad.transformer.StandardScaler
作用:标准化数据。
参数:
cols
: list, 默认值为空列表。需要标准化的列。with_mean
: bool, 默认值为True。是否将数据均值归零。with_std
: bool, 默认值为True。是否将数据方差归一。
scaler = toad.transformer.StandardScaler(cols=['age', 'income'])
data_scaled = scaler.fit_transform(data)
5. toad.transformer.LabelEncoder
作用:标签编码器,用于将分类变量编码为整数。
参数:
cols
: list, 默认值为空列表。需要编码的列。
label_encoder = toad.transformer.LabelEncoder(cols=['categorical_col'])
data_encoded = label_encoder.fit_transform(data)
6. toad.utils.to_categorical
作用:将变量转换为分类变量。
参数:
df
: DataFrame。输入的数据集。cols
: list。需要转换的列。
data = toad.utils.to_categorical(data, cols=['age'])
7. toad.utils.fillna
作用:填补缺失值。
参数:
df
: DataFrame。输入的数据集。value
: dict or scalar, 默认值为None。填补缺失值的策略或具体值。
data_filled = toad.utils.fillna(data, value=0)
8. toad.utils.to_numeric
作用:将变量转换为数值类型。
参数:
df
: DataFrame。输入的数据集。cols
: list。需要转换的列。
numeric_data = toad.utils.to_numeric(data, cols=['age', 'income'])
9. toad.utils.to_categorical
作用:将变量转换为分类变量。
参数:
df
: DataFrame。输入的数据集。cols
: list。需要转换的列。
data = toad.utils.to_categorical(data, cols=['age'])
10. toad.utils.fillna
作用:填补缺失值。
参数:
df
: DataFrame。输入的数据集。value
: dict or scalar, 默认值为None。填补缺失值的策略或具体值。
data_filled = toad.utils.fillna(data, value=0)
分箱与合并
1. toad.transformer.Combiner
作用:将连续变量进行分箱处理。
参数:
method
: str, 默认值为’quantile’。分箱方法(例如,‘quantile’, ‘step’, ‘kmeans’)。min_samples
: int, 默认值为0。每个分箱中的最小样本数。n_bins
: int, 默认值为10。每个变量的分箱数量。
combiner = toad.transformer.Combiner()
combiner.fit(data, y='default')
data_binned = combiner.transform(data)
2. toad.transformer.Combine
作用:将两个变量进行合并。
参数:
df
: DataFrame。输入的数据集。cols
: list。需要合并的列。name
: str。新合并列的名称。func
: function。用于合并的函数,例如sum
、mean
等。
combine = toad.transformer.Combine(cols=['col1', 'col2'], name='combined_col', func='sum')
data_combined = combine.fit_transform(data)
3. toad.transformer.Split
作用:将一个变量进行拆分。
参数:
df
: DataFrame。输入的数据集。col
: str。需要拆分的列。sep
: str。分隔符。names
: list。拆分后新列的名称。
split = toad.transformer.Split(col='combined_col', sep='_', names=['col1', 'col2'])
data_split = split.fit_transform(data)
4. toad.transformer.Bin
作用:对变量进行分箱。
参数:
df
: DataFrame。输入的数据集。col
: str。需要分箱的列。n_bins
: int, 默认值为10。分箱数量。method
: str, 默认值为’quantile’。分箱方法(例如,‘quantile’, ‘step’, ‘kmeans’)。
bin = toad.transformer.Bin(col='age', n_bins=5, method='quantile')
data_binned = bin.fit_transform(data)
5. toad.transformer.Combiner
作用:将连续变量进行分箱处理。
参数:
method
: str, 默认值为’quantile’。分箱方法(例如,‘quantile’, ‘step’, ‘kmeans’)。min_samples
: int, 默认值为0。每个分箱中的最小样本数。n_bins
: int, 默认值为10。每个变量的分箱数量。
combiner = toad.transformer.Combiner()
combiner.fit(data, y='default')
data_binned = combiner.transform(data)
特征选择
1. toad.selection.select
作用:特征选择工具,用于自动选择重要特征。
参数:
target
: str。目标列的名称。empty
: float, 默认值为0.9。缺失值比例的阈值。iv
: float, 默认值为0.02。信息值的阈值。corr
: float, 默认值为0.7。相关系数的阈值。
selected = toad.selection.select(data, target='default', empty=0.9, iv=0.02, corr=0.7)
2. toad.selection.stepwise
作用:逐步回归特征选择。
参数:
X
: DataFrame。特征矩阵。y
: Series。目标变量。direction
: str, 默认值为’both’。选择方向,可以是 ‘forward’、‘backward’ 或 ‘both’。
selected_features = toad.selection.stepwise(X, y, direction='both')
3. toad.selection.high_iv
作用:选择高信息值(IV)的特征。
参数:
df
: DataFrame。输入的数据集。target
: str。目标列的名称。threshold
: float, 默认值为0.02。IV值的阈值。
high_iv_features = toad.selection.high_iv(data, target='default', threshold=0.02)
模型评估
1. toad.metrics.ks
作用:计算KS(Kolmogorov-Smirnov)值。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。
ks_value = toad.metrics.ks(y_true, y_pred)
2. toad.metrics.roc_auc_score
作用:计算AUC(Area Under Curve)。
参数:
y_true
: array-like。真实标签。y_score
: array-like。预测得分。
auc_score = toad.metrics.roc_auc_score(y_true, y_score)
3. toad.metrics.confusion_matrix
作用:计算混淆矩阵。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。
conf_matrix = toad.metrics.confusion_matrix(y_true, y_pred)
4. toad.metrics.precision_score
作用:计算精确率。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。
precision = toad.metrics.precision_score(y_true, y_pred)
5. toad.metrics.recall_score
作用:计算召回率。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。
recall = toad.metrics.recall_score(y_true, y_pred)
6. toad.metrics.f1_score
作用:计算F1得分。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。
f1 = toad.metrics.f1_score(y_true, y_pred)
7. toad.metrics.ks_bucket
**
作用**:计算KS分箱的KS值。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。n_bins
: int, 默认值为10。分箱数量。
ks_buckets = toad.metrics.ks_bucket(y_true, y_pred, n_bins=10)
数据检测与处理
1. toad.utils.detect_categorical
作用:检测数据中的分类变量。
参数:
df
: DataFrame。输入的数据集。exclude
: list, 默认值为空列表。需要排除在外的列。
categorical_vars = toad.utils.detect_categorical(data)
2. toad.utils.drop_na
作用:删除包含缺失值的行或列。
参数:
df
: DataFrame。输入的数据集。axis
: int, 默认值为0。0表示删除行,1表示删除列。how
: str, 默认值为’any’。'any’表示只要有缺失值就删除,'all’表示全部缺失才删除。
clean_data = toad.utils.drop_na(data, axis=0, how='any')
3. toad.utils.clip
作用:裁剪数据。
参数:
df
: DataFrame。输入的数据集。lower
: float, 默认值为None。下限。upper
: float, 默认值为None。上限。
clipped_data = toad.utils.clip(data, lower=0, upper=100)
4. toad.utils.combine
作用:合并两个数据框。
参数:
df1
: DataFrame。第一个数据框。df2
: DataFrame。第二个数据框。on
: str or list。合并的键。
combined_data = toad.utils.combine(df1, df2, on='key_col')
5. toad.utils.drop_na
作用:删除包含缺失值的行或列。
参数:
df
: DataFrame。输入的数据集。axis
: int, 默认值为0。0表示删除行,1表示删除列。how
: str, 默认值为’any’。'any’表示只要有缺失值就删除,'all’表示全部缺失才删除。
clean_data = toad.utils.drop_na(data, axis=0, how='any')
6. toad.utils.clip
作用:裁剪数据。
参数:
df
: DataFrame。输入的数据集。lower
: float, 默认值为None。下限。upper
: float, 默认值为None。上限。
clipped_data = toad.utils.clip(data, lower=0, upper=100)
7. toad.utils.combine
作用:合并两个数据框。
参数:
df1
: DataFrame。第一个数据框。df2
: DataFrame。第二个数据框。on
: str or list。合并的键。
combined_data = toad.utils.combine(df1, df2, on='key_col')
数据可视化
1. toad.plot.ks_plot
作用:绘制KS曲线。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。ax
: matplotlib Axes, 默认值为None。如果提供,则绘制在此轴上。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
toad.plot.ks_plot(y_true, y_pred, ax=ax)
plt.show()
2. toad.plot.roc_plot
作用:绘制ROC曲线。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。ax
: matplotlib Axes, 默认值为None。如果提供,则绘制在此轴上。
fig, ax = plt.subplots()
toad.plot.roc_plot(y_true, y_pred, ax=ax)
plt.show()
3. toad.plot.pr_plot
作用:绘制PR(Precision-Recall)曲线。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。ax
: matplotlib Axes, 默认值为None。如果提供,则绘制在此轴上。
fig, ax = plt.subplots()
toad.plot.pr_plot(y_true, y_pred, ax=ax)
plt.show()
4. toad.plot.iv_plot
作用:绘制信息值(IV)曲线。
参数:
iv
: DataFrame。包含IV值的数据框。threshold
: float, 默认值为0。用于绘制阈值线。ax
: matplotlib Axes, 默认值为None。如果提供,则绘制在此轴上。
iv = toad.IV(data, target='default')
fig, ax = plt.subplots()
toad.plot.iv_plot(iv, threshold=0.02, ax=ax)
plt.show()
5. toad.plot.ks_plot
作用:绘制KS曲线。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。ax
: matplotlib Axes, 默认值为None。如果提供,则绘制在此轴上。
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
toad.plot.ks_plot(y_true, y_pred, ax=ax)
plt.show()
6. toad.plot.roc_plot
作用:绘制ROC曲线。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。ax
: matplotlib Axes, 默认值为None。如果提供,则绘制在此轴上。
fig, ax = plt.subplots()
toad.plot.roc_plot(y_true, y_pred, ax=ax)
plt.show()
7. toad.plot.pr_plot
作用:绘制PR(Precision-Recall)曲线。
参数:
y_true
: array-like。真实标签。y_pred
: array-like。预测标签。ax
: matplotlib Axes, 默认值为None。如果提供,则绘制在此轴上。
fig, ax = plt.subplots()
toad.plot.pr_plot(y_true, y_pred, ax=ax)
plt.show()
8. toad.plot.iv_plot
作用:绘制信息值(IV)曲线。
参数:
iv
: DataFrame。包含IV值的数据框。threshold
: float, 默认值为0。用于绘制阈值线。ax
: matplotlib Axes, 默认值为None。如果提供,则绘制在此轴上。
iv = toad.IV(data, target='default')
fig, ax = plt.subplots()
toad.plot.iv_plot(iv, threshold=0.02, ax=ax)
plt.show()
辅助函数
1. toad.utils.categorical
作用:获取数据集中所有分类变量的列名。
参数:
df
: DataFrame。输入的数据集。
categorical_columns = toad.utils.categorical(data)
2. toad.utils.continuous
作用:获取数据集中所有连续变量的列名。
参数:
df
: DataFrame。输入的数据集。
continuous_columns = toad.utils.continuous(data)
3. toad.utils.categorical
作用:获取数据集中所有分类变量的列名。
参数:
df
: DataFrame。输入的数据集。
categorical_columns = toad.utils.categorical(data)
4. toad.utils.continuous
作用:获取数据集中所有连续变量的列名。
参数:
df
: DataFrame。输入的数据集。
continuous_columns = toad.utils.continuous(data)
示例:信用评分模型
以下是一个使用 toad
库进行信用评分模型构建的完整示例,展示了从数据预处理、特征工程到模型训练和评估的全过程。
假设我们有一个信用评分的数据集,包含用户的基本信息、信用历史和是否违约的标记。我们将使用 toad
库来处理数据并构建一个逻辑回归模型。
步骤 1:导入必要的库
import pandas as pd
import toad
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, accuracy_score
# 示例数据集
data = pd.DataFrame({
'age': [25, 45, 35, 50, 23, 34, 56, 28, 30, 40],
'income': [50000, 100000, 75000, 120000, 30000, 60000, 110000, 50000, 54000, 90000],
'loan_amount': [20000, 30000, 25000, 50000, 10000, 15000, 40000, 20000, 22000, 35000],
'credit_score': [600, 700, 650, 750, 580, 620, 720, 640, 630, 710],
'default': [0, 1, 0, 1, 0, 0, 1, 0, 0, 1]
})
步骤 2:数据预处理
- 填补缺失值
- 分箱处理
- 计算信息值并选择特征
# 填补缺失值
data = toad.utils.fillna(data, value=0)
# 分箱处理
combiner = toad.transformer.Combiner()
combiner.fit(data, y='default')
data_binned = combiner.transform(data)
# 计算信息值(IV)并选择特征
iv = toad.IV(data_binned, target='default')
selected_features = toad.selection.select(data_binned, target='default', iv=0.02)
print('Selected features:\n', selected_features)
步骤 3:WOE转换
# 使用WOETransformer进行WOE转换
woe = toad.transformer.WOETransformer()
data_woe = woe.fit_transform(selected_features, target='default')
步骤 4:分割数据集
# 分割数据集为训练集和测试集
X = data_woe.drop(columns=['default'])
y = data_woe['default']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
步骤 5:训练模型
# 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)
步骤 6:模型评估
# 预测测试集
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]
# 计算AUC和准确率
auc = roc_auc_score(y_test, y_pred_proba)
accuracy = accuracy_score(y_test, y_pred)
print(f'AUC: {auc:.2f}')
print(f'Accuracy: {accuracy:.2f}')
步骤 7:绘制KS曲线和ROC曲线
import matplotlib.pyplot as plt
# 绘制KS曲线
fig, ax = plt.subplots()
toad.plot.ks_plot(y_test, y_pred_proba, ax=ax)
plt.show()
# 绘制ROC曲线
fig, ax = plt.subplots()
toad.plot.roc_plot(y_test, y_pred_proba, ax=ax)
plt.show()
通过上述步骤,我们使用 toad
库完成了一个完整的信用评分模型的构建过程,包括数据预处理、特征工程、模型训练和评估。