scikit-learn线性回归model.score返回NaN错误求助
解决线性回归model.score()出现NaN/无穷值的问题
嘿,我来帮你搞定这个线性回归的NaN报错问题!你已经移除了数据集的空行,但model.score()还是提示输入里有NaN、无穷值或者超出float64范围的数值,咱们一步步排查解决:
1. 检查并处理隐藏的NaN/无穷值
你只移除了整行空值,但个别特征列里可能还存在单个单元格的NaN或者无穷值(比如Engine_HP、Engine_Cylinders这类数值列可能有缺失没被处理)。先执行以下代码确认:
# 检查测试集里的NaN数量 print(X_test.isnull().sum()) # 检查测试集里的无穷值数量 print(np.isinf(X_test).sum())
如果发现有NaN或无穷值,按以下方式处理(注意用训练集的统计量填充测试集,避免数据泄露):
# 填充NaN:用训练集的均值填充 X_train = X_train.fillna(X_train.mean()) X_test = X_test.fillna(X_train.mean()) # 替换无穷值:同样用训练集的均值替换 X_train = X_train.replace([np.inf, -np.inf], X_train.mean()) X_test = X_test.replace([np.inf, -np.inf], X_train.mean())
2. 特征尺度差异过大导致数值溢出
你的数据里像MSRP(汽车价格)这类特征数值可能非常大,和Year、Popularity这类小尺度特征差异悬殊,线性回归计算时容易出现数值溢出问题。建议对特征做标准化处理:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() # 用训练集拟合标准化器,再转换训练集和测试集 X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test)
3. 验证训练集与测试集的列一致性
虽然你先对整个数据集做了one-hot编码再拆分训练测试,但还是可以确认两者的列是否完全一致,避免出现列不匹配的问题:
print(X_train.columns.equals(X_test.columns))
整合后的完整代码
把以上步骤整合到你的代码里,修改后如下:
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.preprocessing import StandardScaler # 读取数据集 d = pd.read_csv('cars.csv') # 移除不需要的列 drop_columns = ['Make', 'Model', 'Engine_Fuel_Type', 'Number_of_Doors', 'Market_Category', 'Vehicle_Size', 'Vehicle_Style'] d = d.drop(drop_columns, axis=1) # 转换Transmission_Type为文字并做one-hot编码 d['Transmission_Type'] = d['Transmission_Type'].replace({ 1: 'MANUAL', 2: 'AUTOMATIC', 3: 'AUTOMATED_MANUAL', 4: 'DIRECT_DRIVE', 5: 'UNKNOWN' }) d = pd.get_dummies(d, columns=['Transmission_Type']) # 拆分特征与目标变量 X = d.drop('city_mpg', axis=1) y = d[['city_mpg']] # 拆分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1) # 处理NaN和无穷值 X_train = X_train.fillna(X_train.mean()) X_test = X_test.fillna(X_train.mean()) X_train = X_train.replace([np.inf, -np.inf], X_train.mean()) X_test = X_test.replace([np.inf, -np.inf], X_train.mean()) # 特征标准化 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 训练线性回归模型 model = LinearRegression() model.fit(X_train_scaled, y_train) # 输出系数与截距 for idx, col_name in enumerate(X_train.columns): print(f"Co efficient for {col_name} is {model.coef_[0][idx]}") intercept = model.intercept_[0] print(f"Intercept is {intercept}") # 评估模型 print(model.score(X_test_scaled, y_test))
按照这个流程处理后,应该就能解决model.score()的NaN报错问题啦!
内容的提问来源于stack exchange,提问作者Mridu Sai Charan A. S.
相关产品推荐
相关产品推荐

