信用评分模型优化
[题目链接](https://www.nowcoder.com/practice/aec5f31464954a4d986f541b6f71eeef)
题目分析
给定一组信用卡申请者的数据(二维列表),每行一条记录,最后一列为目标变量(Good/Bad),倒数第二列为字符串特征,其余列为数值特征。要求使用基于决策树的特征选择方法,找出最重要的特征并输出其索引(从 0 开始)。
思路
决策树特征重要性
scikit-learn 的 DecisionTreeClassifier 训练后会生成 feature_importances_ 属性,它基于每个特征在所有分裂节点上的加权不纯度减少量(Gini 重要性)来衡量特征的重要程度。
处理流程:
- 解析输入:输入是一个 Python 字面量格式的二维列表,用
ast.literal_eval解析。 - 分离特征和标签:最后一列为目标变量
,其余列为特征矩阵
。
- 编码非数值特征:对字符串类型的列(倒数第二列)使用
LabelEncoder转为数值;对目标变量同样编码。 - 训练决策树:使用
DecisionTreeClassifier(random_state=42)拟合数据。 - 输出最重要特征:取
feature_importances_中最大值对应的索引。
以样例验证:输入 4 条记录、3 个特征(收入、编号、是否有某属性),目标为信用好坏。训练后特征 2(Yes/No 列)的重要性最高,输出 2。
复杂度
- 时间复杂度:
,其中
为样本数,
为特征数,为决策树训练的典型复杂度。
- 空间复杂度:
,存储特征矩阵。
代码
import ast
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import LabelEncoder
data = ast.literal_eval(input())
data = np.array(data)
X = data[:, :-1]
y = data[:, -1]
le_y = LabelEncoder()
y_encoded = le_y.fit_transform(y)
X_encoded = np.zeros((X.shape[0], X.shape[1]), dtype=float)
for j in range(X.shape[1]):
try:
X_encoded[:, j] = X[:, j].astype(float)
except (ValueError, TypeError):
le = LabelEncoder()
X_encoded[:, j] = le.fit_transform(X[:, j])
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_encoded, y_encoded)
print(np.argmax(clf.feature_importances_))

京公网安备 11010502036488号