写在前面: 这篇文章将通过线性回归模型预测汽车的燃油效率,文本所用到的数据
以及代码
可根据文末的联系方式向我索取
import pandas as pd
import matplotlib.pyplot as plt
cars = pd.read_csv('../data/auto-mpg.data',names=["燃油效率","气缸","排量","马力","重量","加速度","型号年份","编号","原产地"],delim_whitespace = True)
cars.head()
import numpy as np
import matplotlib.ticker as ticker
#删除horsepower值为'?'的行
cars = cars[cars.马力 != '?']
#设置中文显示
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
#用散点图分别展示气缸、排量、重量、加速度与燃油效率的关系
fig = plt.figure(figsize = (13,10))
ax1 = fig.add_subplot(321)
ax2 = fig.add_subplot(322)
ax3 = fig.add_subplot(323)
ax4 = fig.add_subplot(324)
ax5 = fig.add_subplot(325)
ax1.scatter(cars['气缸'], cars['燃油效率'], alpha=0.5)
ax1.set_title('气缸')
ax2.scatter(cars['排量'], cars['燃油效率'], alpha=0.5)
ax2.set_title('排量')
ax3.scatter(cars['重量'], cars['燃油效率'], alpha=0.5)
ax3.set_title('重量')
ax4.scatter(cars['加速度'], cars['燃油效率'], alpha=0.5)
ax4.set_title('加速度')
ax5.scatter([ float(x) for x in cars['马力'].tolist()], cars['燃油效率'], alpha=0.5)
ax5.set_title('马力')
从上图中可以看出汽车的燃油效率与排量、重量、马力三者都存在一定的线性关系,其中汽车重量与燃油效率线性关系最为明显,下面我们取这二者来构建一元线性回归模型,看看是否能通过汽车重量来预测汽车的燃油效率。
Y = cars['燃油效率']
X = cars['重量']
X = X.reshape(len(X),1)
Y = Y.reshape(len(Y),1)
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
from sklearn.linear_model import LinearRegression
LR = LinearRegression()
LR = LR.fit(X_train, Y_train)
import matplotlib.pyplot as plt
plt.scatter(X_train, Y_train, color='red', alpha=0.3)
plt.scatter(X_train, LR.predict(X_train), color='green', alpha=0.3)
plt.xlabel("重量")
plt.ylabel("燃油效率")
plt.title("这是训练数据")
plt.show()
plt.scatter(X_test, Y_test, color='blue', alpha=0.3)
plt.scatter(X_train, LR.predict(X_train), color='green', alpha=0.3)
plt.xlabel("重量")
plt.ylabel("燃油效率")
plt.title("这是测试集数据")
plt.show()
score = LR.score(cars[['重量']],cars['燃油效率'])
score
"""
得分为:0.6925641006507041
"""
通过汽车重量与燃油效率构建的一元线性回归模型的得分为0.69,上文我们得知汽车的燃油消耗率不仅和汽车重量是线性线性关系,也和汽车排量、马力存在着线性关系。如果采用多元线性回归模型预测效果是否更好呢?
#初始化模型
mul_LR_model = LinearRegression()
"""
拟合模型
多元线性回归模型的调用相对于一元线性回归,仅需要将X的传入由一个变为多个,即
由:LR_model.fit(cars['重量'], cars['燃油效率'])
变为:LR_model.fit(cars[['重量','马力','排量']], cars['燃油效率'])
"""
mul_LR_model.fit(cars[['重量','马力','排量']], cars['燃油效率'])
#预测
cars['燃料效率预测值'] = mul_LR_model.predict(cars[['重量','马力','排量']])
#显示
cars.head(5)
mul_score = mul_LR_model.score(cars[['重量','马力','排量']], cars['燃油效率'])
mul_score
"""
mul_score得分为:0.7069554693444708
"""
多元线性回归模型的得分为0.71相对于一元线性回归模型(0.69分)得分更高,预测效果更好。
fig = plt.figure(figsize = (16,8))
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax1.scatter(cars['重量'], cars['燃油效率'], c='blue', alpha=0.3)
ax1.scatter(cars['重量'], cars['燃料效率预测值'], c='red', alpha=0.3)
ax1.set_title('重量')
ax2.scatter([ float(x) for x in cars['马力'].tolist()], cars['燃油效率'], c='blue', alpha=0.3)
ax2.scatter([ float(x) for x in cars['马力'].tolist()], cars['燃料效率预测值'], c='red', alpha=0.3)
ax2.set_title('马力')
ax3.scatter(cars['排量'], cars['燃油效率'], c='blue', alpha=0.3)
ax3.scatter(cars['排量'], cars['燃料效率预测值'], c='red', alpha=0.3)
ax3.set_title('排量')
plt.show()