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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:41:54