读取UCI Auto-MPG数据集时字符串转浮点错误的技术求助
问题解决方法
核心错误原因
你使用的car_data是数据集的目录URL,而非具体的数据文件地址,导致pd.read_csv读取到的是UCI网站的HTML页面内容,不是实际的汽车数据,这才让horsepower列出现HTML标签字符串,无法转为浮点数。
修正后的完整代码
import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler # 修正为具体的数据文件URL car_data = "https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data" # 读取数据,指定分隔符为任意空白,处理缺失值标记'?' auto_data = pd.read_csv( car_data, delim_whitespace=True, header=None, names=['mpg', 'cylinders', 'displacement','horsepower', 'weight', 'acceleration','model year', 'origin', 'car name'], na_values='?' ) # 直接删除含缺失值的行 auto_data = auto_data.dropna(subset=['horsepower']) # 转换horsepower为浮点型 auto_data['horsepower'] = auto_data['horsepower'].astype(float) # 移除无关列 auto_data = auto_data.drop('car name', axis=1) # 归一化处理 scaler = MinMaxScaler() data_scaled = scaler.fit_transform(auto_data) s_data = pd.DataFrame(data_scaled, columns=auto_data.columns) # 拆分特征X和目标y(不需要转成三维数组,保持二维即可) X = s_data.drop('mpg', axis=1).values y = s_data['mpg'].values.reshape(-1, 1) # 初始化参数 w = np.zeros((X.shape[1], 1)) # 维度匹配特征数 b = 0.0 alpha = 0.01 epochs = 50000 n_samples = len(X) # 梯度下降迭代 for i in range(epochs): # 计算预测值 y_pred = np.dot(X, w) + b # 计算梯度 dw = (1/n_samples) * np.dot(X.T, (y_pred - y)) db = (1/n_samples) * np.sum(y_pred - y) # 更新参数 w -= alpha * dw b -= alpha * db print("权重参数w:", w.flatten()) print("偏置参数b:", b)
关键修正点
- 修正数据URL:将目录地址改为
auto-mpg.data具体文件地址,确保读取到正确的数据集而非HTML页面。 - 缺失值处理优化:用
na_values='?'直接将?标记为缺失值,再用dropna删除对应行,比手动筛选更可靠。 - 维度修复:原代码中
fs_data = np.array([s_data])创建了三维数组,导致后续矩阵乘法维度不匹配,修正为直接用二维数组处理特征和目标变量。 - 梯度下降计算优化:调整权重和偏置的计算逻辑,确保矩阵运算维度一致,避免报错。
内容的提问来源于stack exchange,提问作者Brandon Cavazos
相关产品推荐
相关产品推荐

