信用评分模型优化

[题目链接](https://www.nowcoder.com/practice/aec5f31464954a4d986f541b6f71eeef)

题目分析

给定一组信用卡申请者的数据(二维列表),每行一条记录,最后一列为目标变量(Good/Bad),倒数第二列为字符串特征,其余列为数值特征。要求使用基于决策树的特征选择方法,找出最重要的特征并输出其索引(从 0 开始)。

思路

决策树特征重要性

scikit-learn 的 DecisionTreeClassifier 训练后会生成 feature_importances_ 属性,它基于每个特征在所有分裂节点上的加权不纯度减少量(Gini 重要性)来衡量特征的重要程度。

处理流程

  1. 解析输入:输入是一个 Python 字面量格式的二维列表,用 ast.literal_eval 解析。
  2. 分离特征和标签:最后一列为目标变量 ,其余列为特征矩阵
  3. 编码非数值特征:对字符串类型的列(倒数第二列)使用 LabelEncoder 转为数值;对目标变量同样编码。
  4. 训练决策树:使用 DecisionTreeClassifier(random_state=42) 拟合数据。
  5. 输出最重要特征:取 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_))