You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Sklearn训练分类模型时遇特征名匹配警告及结果不输出问题

问题分析与解决方案

一、解决警告“X has feature names, but Classifier was fitted without feature names”

核心原因:拟合模型时传入的是无特征名的numpy数组,预测时传入的是带特征名的Pandas DataFrame,两者格式不匹配引发Sklearn的格式校验警告。

修复方案(二选一即可)

方案1:全程使用Pandas DataFrame(保留特征名)
# 数据拆分(保持原有逻辑)
x = dataset_df.drop(columns="target", axis=1)
x_train, x_test, y_train, y_test = train_test_split(x, dataset_df.target, test_size=testset_size)

# 标准化时保留列名,避免丢失特征名信息
scaler = StandardScaler()
x_train_scaled = pd.DataFrame(scaler.fit_transform(x_train), columns=x_train.columns)
x_test_scaled = pd.DataFrame(scaler.transform(x_test), columns=x_test.columns)

# 拟合与预测统一使用DataFrame
dt_cls = DecisionTreeClassifier()
dt_cls.fit(x_train_scaled, y_train)

y_pred = dt_cls.predict(x_test_scaled)
acc = accuracy_score(y_pred, y_test)
prec = precision_score(y_pred, y_test, pos_label=1)
recall = recall_score(y_pred, y_test, pos_label=1, zero_division=1)

print(acc, prec, recall)
return acc, prec, recall

方案2:全程使用numpy数组(丢弃特征名)
# 数据拆分时直接转为numpy数组
x = dataset_df.drop(columns="target", axis=1).values
y = dataset_df.target.values
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=testset_size)

# 标准化后直接返回数组,无需额外转换
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(x_train)
x_test_scaled = scaler.transform(x_test)

# 拟合与预测统一使用数组
dt_cls = DecisionTreeClassifier()
dt_cls.fit(x_train_scaled, y_train)

y_pred = dt_cls.predict(x_test_scaled)
acc = accuracy_score(y_pred, y_test)
prec = precision_score(y_pred, y_test, pos_label=1)
recall = recall_score(y_pred, y_test, pos_label=1, zero_division=1)

print(acc, prec, recall)
return acc, prec, recall

二、解决计算acc后无输出的问题

  1. 检查函数调用逻辑:如果代码在函数内,需确保调用函数后执行打印操作。例如:
    # 假设训练逻辑封装在train_model函数中
    def train_model():
        # 训练代码...
        return acc, prec, recall
    
    # 调用并打印结果
    acc, prec, recall = train_model()
    print(f"准确率:{acc}, 精确率:{prec}, 召回率:{recall}")
    
  2. 验证数据有效性:打印y_pred和y_test的前5个值,确认数据是否正常加载、预测是否有结果:
    print("预测结果前5个:", y_pred[:5])
    print("真实标签前5个:", y_test[:5])
    
  3. 屏蔽干扰警告:如果大量警告掩盖了输出,可临时关闭Sklearn的UserWarning:
    import warnings
    warnings.filterwarnings("ignore", category=UserWarning)
    

三、额外注意事项

  • 所有模型(DecisionTree、RandomForest、SVC)需统一数据格式,避免混合使用DataFrame和numpy数组。
  • 标准化必须使用同一个StandardScaler实例处理训练集和测试集,禁止分别对训练集和测试集执行fit操作,否则会破坏数据分布一致性,影响模型效果。

内容的提问来源于stack exchange,提问作者mangs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:55:28