表格分类模型怎么训练?用 scikit-learn 完成划分、拟合和预测

用 scikit-learn 在数值表格上完成分层划分、标准化、逻辑回归训练和预测,并用多数类基线与混淆矩阵检查结果。

有了数值特征和人工确认的分类标签,可以先用 scikit-learn 建立一个可检查的基线。完整路线是先留出测试集,再在训练集上拟合标准化与分类器,最后逐条对照预测和真值。这里用逻辑回归;它名称里有“回归”,但 LogisticRegression 解决的是分类问题。

先明确输入、标签和测试集

示例核对环境为 Python 3.11、scikit-learn 1.9.1、NumPy 2.4.6;涉及表格的代码还使用 pandas 3.0.6。资料核对日期为 2026 年 10 月 1 日。代码在 CPU 上运行,不需要账号、API 密钥或下载预训练权重。

表格分类模型怎么训练?用 scikit-learn 完成划分、拟合和预测

下面生成 400 条、每条 6 个数值特征的二分类演示数据。0/1 只是人为生成的类别,不代表欺诈、疾病或其他业务标签;示例得分不能推断真实业务效果。真实任务应有一行一个样本、特征数固定的 X,以及与各行对应的 y。不要把样本编号、答案列或预测时才会产生的信息塞进特征。

训练集用于学习,测试集只用于这次独立检查。同一用户、同一文档的多个版本或连续时间记录可能互相关联,不能直接照搬随机分层划分;需要按组或时间划分。train_test_split 官方文档说明了 test_size、stratify 和 random_state 的含义:分层尽量维持类别比例,随机种子便于在同一环境复现,并不自动排除关联样本泄漏。

保存脚本,跑通拟合和预测

python -m venv .venv
# Windows PowerShell 中使用这个环境的解释器:
.\.venv\Scripts\python.exe -m pip install scikit-learn==1.9.1 numpy==2.4.6 pandas==3.0.6
.\.venv\Scripts\python.exe demo.py

把下方完整 Python 代码保存为 demo.py,再运行最后一条命令。macOS/Linux 使用 .venv/bin/python 代替 Windows 路径。安装需要网络;完成安装后,这些示例的数据在代码中生成,可离线运行。使用其他版本时先打印 sklearn.__version__,不要把两个环境的报错混在一起排查。

先运行下方完整脚本,再将 X 和 y 换成已经检查过的真实数据。Pipeline 把缩放和分类器放在一起;fit 只接收训练数据,predict 自动执行已经拟合好的缩放。LogisticRegression 官方接口可核对 max_iter 和分类预测方法。

import numpy as np
import sklearn
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score, confusion_matrix

X, y = make_classification(n_samples=400, n_features=6, n_informative=4,
                          n_redundant=0, random_state=7)
indices = np.arange(len(y))
train_id, test_id = train_test_split(indices, test_size=0.25,
                                    stratify=y, random_state=7)
assert not set(train_id) & set(test_id)
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
model.fit(X[train_id], y[train_id])
pred = model.predict(X[test_id])
baseline = DummyClassifier(strategy="most_frequent").fit(X[train_id], y[train_id])
print("sklearn", sklearn.__version__)
print("shape", X.shape, "train/test", len(train_id), len(test_id))
print("accuracy", round(accuracy_score(y[test_id], pred), 3))
print("baseline", round(baseline.score(X[test_id], y[test_id]), 3))
print("confusion\n", confusion_matrix(y[test_id], pred, labels=[0, 1]))
print("sample id/true/pred", list(zip(test_id[:5].tolist(), y[test_id[:5]].tolist(), pred[:5].tolist())))
assert pred.shape == y[test_id].shape and set(pred) <= {0, 1}

核对结果,别只盯着一个分数

本次在上述环境运行,输出如下。生成数据有固定种子,这些数值是演示代码的实际输出,不是产品测评或真实客户案例。

sklearn 1.9.1
shape (400, 6) train/test 300 100
accuracy 0.9
baseline 0.5
confusion
 [[46  4]
 [ 6 44]]
sample id/true/pred [(347, 0, 0), (19, 0, 0), (207, 1, 1), (240, 0, 0), (95, 1, 1)]

首先核对 train/test 为 300/100,两个编号集合无交集,预测长度等于 100。混淆矩阵固定标签顺序为 [0, 1]:行是真值,列是预测。这里 6 条真值为 1 的样本被预测成 0,4 条真值为 0 的样本被预测成 1;只报 0.9 的准确率会隐藏这两个错误方向。多数类基线为 0.5,可以确认这个演示模型没有仅输出同一个类别。

再回查 sample id/true/pred 中的编号,确认取真值时使用了同一批 test_id。真实数据中要保留业务样本编号,这样才能把错误定位回原记录。测试集用过以后,不要不断调参直到这份测试集分数满意;调参应另设验证集或交叉验证,再做最终测试。

接入自己的表格时先解决这些问题

  • 含城市名等字符串:先为类别列编码,不能直接送进这个纯数值脚本。
  • 含空值或无穷值:先定义处理规则。不能靠删除所有报错行悄悄改变样本分布。
  • 出现收敛警告:核对特征尺度、数据量和迭代上限,再查看警告正文;程序有预测结果不代表优化已完成。
  • 某类只有一条:分层划分可能报错。先补充有效样本或重新制定验证方式,不能为了运行随意把它改成另一类。

这篇练习完成的是数值分类的首次训练与验证。正式模型还需要定义错误成本、独立数据来源和更新规则;高分演示不能替代这些检查。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30563.html

赞 (0)
AI小管家的头像AI小管家
DeepSeek 和 Qwen 是什么关系?产品、模型和开源项目别混淆
上一篇 1天前
数值和类别特征怎么一起处理?用 ColumnTransformer 建立混合列管道
下一篇 1天前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部