核心概念
- 特征选择:识别对目标变量预测最有价值的特征
- 决策树算法:
- 通过递归划分数据构建树形结构
- 使用基尼不纯度或信息增益选择最佳划分特征
- 特征重要性 = 该特征减少的不纯度 × 覆盖样本比例
- 标签编码:将分类变量(如"Yes/No")转换为数值
解题思路
- 数据预处理:
- 对字符串特征进行标签编码
- 分离特征矩阵和目标变量
- 决策树训练:
- 使用所有特征训练决策树分类器
- 特征重要性分析:
- 提取每个特征的重要性分数
- 选择重要性最高的特征
- 结果输出:返回最重要特征的索引
代码解析
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import LabelEncoder
# 读取输入数据
data = eval(input().strip())
# 创建两个标签编码器
encoder1 = LabelEncoder() # 用于倒数第二列(字符串特征)
encoder2 = LabelEncoder() # 用于目标变量
# 编码字符串特征(倒数第二列)
str_feature_col = [row[-2] for row in data] # 提取所有样本的字符串特征
encoded_str_feature = encoder1.fit_transform(str_feature_col)
# 编码目标变量(最后一列)
target_col = [row[-1] for row in data] # 提取所有样本的目标变量
encoded_target = encoder2.fit_transform(target_col)
# 更新数据集:将原始字符串替换为编码值
for i in range(len(data)):
data[i][-2] = encoded_str_feature[i] # 更新字符串特征
data[i][-1] = encoded_target[i] # 更新目标变量
# 准备特征矩阵和标签向量
features = []
labels = []
for row in data:
features.append(row[:-1]) # 所有列除了最后一列都是特征
labels.append(row[-1]) # 最后一列是目标变量
# 转换为NumPy数组并确保数值类型
X = np.array(features).astype(float)
y = np.array(labels)
# 训练决策树模型
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X, y)
# 获取特征重要性并确定最重要特征
feature_importances = clf.feature_importances_
most_important_index = np.argmax(feature_importances)
# 输出结果
print(most_important_index)
关键步骤说明
-
数据预处理:
- 倒数第二列(字符串特征)使用
LabelEncoder
转换为数值 - 目标变量("Good"/"Bad")使用另一个
LabelEncoder
转换 - 示例转换:
- "Yes" → 1, "No" → 0
- "Good" → 1, "Bad" → 0
- 倒数第二列(字符串特征)使用
-
特征矩阵构建:
- 特征:所有列除最后一列
- 目标:最后一列
- 确保所有特征为数值类型(
astype(float)
)
-
决策树训练:
- 使用默认参数的
DecisionTreeClassifier
random_state=42
确保结果可复现- 模型自动学习特征与信用评分的关联
- 使用默认参数的
-
特征重要性提取:
feature_importances_
属性返回各特征的重要性分数- 重要性分数总和为1,值越大表示特征越重要
np.argmax()
获取最高分特征的索引
应用场景
- 信用评分模型优化
- 客户流失预测
- 欺诈检测
- 营销响应预测
总结
本题实现了基于决策树的特征选择方法:
- 通过标签编码处理分类变量
- 训练决策树模型学习特征与信用的关联
- 提取特征重要性分数
- 确定最具预测力的特征
该方法能帮助银行识别影响信用评分的关键因素,优化信用卡审批流程,降低违约风险,同时提高模型的预测准确性。