实验任务:
本次任务是基于measurements.xlsx数据集,利用回归模型预测汽车的耗油量,数据集共有388个样本,11个特征,1个标签 (即consume,消耗量(L / 100km)),特征与标签的表示如下:
列名 | 说明 |
distance | 行车距离(km) |
consume | 消耗量(L / 100km) |
speed | 平均速度(km / h) |
temp_inside | 车内温度(°C) |
temp_outside | 车外温度(°C) |
specials | 是否发生了什么特别的事 |
gas_type | 使用的汽油类型 |
AC | 是否开空调 |
rain | 是否下雨 |
sun | 是否阳光明媚 |
refill_liters | 补充的公升 |
refill_gas | 补充的汽油类型 |
具体要求:
- 导入数据:将数据集读取为Pandas的DataFrame格式。
- 数据探索性分析:可包括但不限于:查看数据的信息、数据维度、特征取值、特征的分布情况,特征之间的相关性等。
- 数据预处理:
- 查看是否有缺失值,若有,请填充缺失值;
- 去除“specials”,“refill_liters”,“refill_gas”特征属性;
- 对特征“gas_type” (采用pandas的get_dummies) 进行one-hot编码;
- 分离标签y和特征X。
- 划分数据集:将数据集划分为训练集和测试集,其中,训练集为 X_train(75%),训练集标签为 y_train,测试集为 X_test,测试集标签 y_test (可自定义名称)。
- 数据建模:
- 分别使用LinearRegression、Ridge和Lasso等构建模型(Ridge和Lasso中可选择不同的参数alpha比较效果);
- 输出回归系数,得到预测结果。
- 模型效果评估:输出MSE 、决定系数R2等,比较不同模型的效果。
实践代码
导入数据
data = pd.read_excel('./measurements.xlsx')
data = pd.DataFrame(data)
数据探索性分析
# 剔除无用信息specials, refill_liters, refill_gas.
data = data.drop(['specials','refill_liters','refill_gas'], axis=1)
# 查看关键信息是否拥有缺失值
print(data.isnull().sum())
# 处理缺失值temp_inside——均值填充
mean = math.ceil(data.iloc[:, 3].mean()) # 均值向上取整
data = data.fillna(mean)
# gas_trpe进行one-hot编码, 替换结果gas_0为E10, gas_1为E85
# print(data['gas_type'])
df = pd.get_dummies(data, columns=['gas_type'], prefix='gas_type')
df = df.replace(True, 1)
df = df.replace(False, 0)
# 再检查是否有缺失值
print()
print(df.isnull().sum())
划分数据集
# 分析题目, 划分自变量x1~x9, 因变量y
y = df.iloc[:, 1]
x = df.drop(['consume'], axis=1)
# 划分测试集、训练集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=33, test_size=0.25)
数据建模LinearRegression
# 初始化学习器实例
lr = LinearRegression()
# 使用训练集训练模型参数
lr.fit(x_train, y_train)
# 使用测试集预测得到预测结果
yl_predict = lr.predict(x_test)
# 模型评估
l_mse = mse(y_test, yl_predict)
l_r2 = r2(y_test, yl_predict)
# 结果展示
print(f"LinearRegression 预测结果:\n{yl_predict}")
print(f"\nLinearRegression 回归系数:\n{lr.coef_}")
数据建模Ridge
# 枚举得到Ridge模型最优alpha值
ap = np.arange(0.01, 100, 0.1)
best_rr_mse = 10000
best_rr_r2 = -1
best_alpha_rr = 0
for alpha in ap:
rr = Ridge(alpha=alpha)
rr.fit(x_train, y_train)
yr_predict = rr.predict(x_test)
rr_mse = mse(y_test, yr_predict)
rr_r2 = r2(y_test, yr_predict)
if rr_mse < best_rr_mse and rr_r2 > best_rr_r2:
best_rr_r2 = rr_r2
best_rr_mse = rr_mse
best_alpha_rr = alpha
# 得到最优Ridge模型
rr = Ridge(alpha=best_alpha_rr)
rr.fit(x_train, y_train)
yr_predict = rr.predict(x_test)
# 结果展示
print(f"Ridge 预测结果:\n{yr_predict}")
print(f"\nRidge 回归系数:\n{rr.coef_}")
数据建模Lasso
ap = np.arange(0.01, 100, 0.1)
best_lsr_mse = 10000
best_lsr_r2 = -1
best_alpha_lsr = 0
for alpha in ap:
lsr = Lasso(alpha=alpha)
lsr.fit(x_train, y_train)
lsr_predict = lsr.predict(x_test)
lsr_mse = mse(y_test, yr_predict)
lsr_r2 = r2(y_test, yr_predict)
if lsr_mse < best_lsr_mse and lsr_r2 > best_lsr_r2:
best_lsr_r2 = lsr_r2
best_lsr_mse = lsr_mse
best_alpha_lsr = alpha
# 得到最优 Lasso 模型
lsr = Lasso(alpha=best_alpha_lsr)
lsr.fit(x_train, y_train)
lsr_predict = lsr.predict(x_test)
# 结果展示
print(f"Lasso 预测结果:\n{lsr_predict}")
print(f"\nLasso 回归系数:\n{lsr.coef_}")
print(f"模型\t\t\tMSE\t\t\tR^2\nLinearRegression\t{l_mse}\t{l_r2}\nRidge\t\t\t{rr_mse}\t{rr_r2}\nLasso\t\t\t{lsr_mse}\t{lsr_r2}")