从线性回归(Linear regression)开始学习回归分析,线性回归是最早的也是最基本的模型——把数据拟合成一条直线。数据集使用scikit-learn里的数据集boston,boston数据集很适合用来演示线性回归。boston数据集包含了波士顿地区的房屋价格中位数。还有一些可能会影响房价的因素,比如犯罪率(crime rate)。
加载数据
from sklearn import datasets boston = datasets.load_boston() import pandas as pd import warnings # 用来忽略seaborn绘图库产生的warnings warnings.filterwarnings("ignore") import seaborn as sns import matplotlib.pyplot as plt sns.set(style="white", color_codes=True) %matplotlib inline dfdata = pd.DataFrame(boston.data,columns=boston.feature_names) dfdata["target"] = boston.target dfdata.head()
fig = plt.figure() for i,f in enumerate(boston.feature_names): sns.jointplot(x=f, y="target", data=dfdata, kind='reg', size=6)
用scikit-learn的线性回归非常简单
首先,导入LinearRegression类创建一个对象:
from sklearn.linear_model import LinearRegression lr = LinearRegression()
现在,再把自变量和因变量传给LinearRegression的fit方法: lr.fit(boston.data, boston.target)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
开始预测
predictions = lr.predict(boston.data)
用预测值与实际值的残差(residuals)直方图分布来直观显示预测结果:
%matplotlib inline f, ax = plt.subplots(figsize=(7, 5)) f.tight_layout() ax.hist(boston.target-predictions,bins=40, label='Residuals Linear', color='b', alpha=.5); ax.set_title("Histogram of Residuals") ax.legend(loc='best');
lr.coef_
def plotCofBar(x_feature,y_cof): x_value = range(len(x_feature)) plt.bar(x_value, y_cof, alpha = 1, color = 'r', align="center") plt.autoscale(tight=True) plt.xticks([i for i in range(len(x_feature))],x_feature,rotation="90") plt.xlabel("feature names") plt.ylabel("cof") plt.title("The cof of Linear regression") plt.show()
plotCofBar(boston.feature_names,lr.coef_)
线性回归原理
线性回归的基本理念是找出满足 y=Xβy=Xβ 的相关系数集合 ββ ,其中 XX 是因变量数据矩阵。想找一组完全能够满足等式的相关系数很难,因此通常会增加一个误差项表示不精确程度或测量误差。因此,方程就变成了 y=Xβ+ϵy=Xβ+ϵ,其中 ϵϵ 被认为是服从正态分布且与 XX 独立的随机变量。用几何学的观点描述,就是说这个变量与 XX 是正交的(perpendicular)。可以证明 E(Xϵ)=0E(Xϵ)=0。
为了找到相关系数集合 ββ ,我们最小化误差项,这转化成了残差平方和最小化问题。
这个问题可以用解析方法解决,其解是:
lr2 = LinearRegression(normalize=True) lr2.fit(boston.data, boston.target)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=True)
predictions2 = lr2.predict(boston.data) %matplotlib inline from matplotlib import pyplot as plt f, ax = plt.subplots(figsize=(7, 5)) f.tight_layout() ax.hist(boston.target-predictions2,bins=40, label='Residuals Linear', color='b', alpha=.5); ax.set_title("Histogram of Residuals") ax.legend(loc='best');