使用SKLearn构建逻辑回归时,如何正确准备X特征数据?
正确使用Scikit-learn构建逻辑回归的X数据准备方法
问题核心拆解
输入格式要求:Scikit-learn所有监督模型要求特征矩阵X必须是二维数组(形状为
(样本数, 特征数)),你最初遇到的ValueError就是因为传入了一维的价格数据,使用x.reshape(-1,1)将其转换为(n_samples, 1)的二维数组是完全正确的格式处理方式。未缩放导致系数异常的原因:
LogisticRegression默认启用L2正则化(penalty='l2'),当特征的量纲过大(比如每平米价格是数百到数千欧元),正则化会对大尺度特征的系数施加极强的惩罚,直接导致系数被压缩到接近0,甚至出现与理论预期相反的符号。测试集缩放的致命错误:
你的代码中对测试集使用了scaler.fit_transform(X_test),这是错误的——测试集必须复用训练集拟合的缩放规则(即只调用scaler.transform(X_test)),否则会重新计算测试集的均值和标准差,引入数据泄露,破坏模型的泛化能力。
正确的X数据准备步骤
- 提取特征与目标变量,确保X为二维数组
- 先划分训练集/测试集,再进行特征缩放(避免数据泄露)
- 仅用训练集拟合缩放器,用同一缩放器转换训练集和测试集
- 基于缩放后的训练集训练模型,用缩放后的测试集评估
修正后的完整代码
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, confusion_matrix # 1. 读取数据并提取变量 df = pd.read_csv('Data_file.csv', sep=',') y = df['AC_Binary'] # 直接用二维数组格式提取特征,避免后续reshape X = df[['Price_gross_m2']].values # 2. 划分训练集与测试集(必须在缩放前执行) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=15) # 3. 特征缩放:仅在训练集拟合,同时转换训练/测试集 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) # 测试集仅用transform,复用训练集的均值和标准差 X_test_scaled = scaler.transform(X_test) # 4. 训练与评估逻辑回归模型 logistic_model = LogisticRegression() logistic_model.fit(X_train_scaled, y_train) y_pred = logistic_model.predict(X_test_scaled) # 输出评估结果 accuracy = accuracy_score(y_test, y_pred) * 100 confusion_mat = confusion_matrix(y_test, y_pred) coefficients = logistic_model.coef_ intercept = logistic_model.intercept_ print('预测结果:', y_pred) print('准确率:', accuracy) print('混淆矩阵:', confusion_mat) print('回归系数:', coefficients) print('截距:', intercept)
关键注意事项
- 特征格式:即使是单特征,也必须保证X是二维数组,除了
reshape(-1,1),还可以直接用df[['列名']].values(双层方括号返回DataFrame,转成数组就是二维) - 缩放时机:必须先划分数据集再缩放,绝对不能在全量数据上拟合缩放器后再划分
- 测试集处理:测试集只能用训练集拟合的缩放器进行转换,禁止重新拟合
内容的提问来源于stack exchange,提问作者Dan_San
相关产品推荐
相关产品推荐

