预测波士顿房价-线性回归(Ridge)
1.数据集
使用的是sklearn.datasets.load_boston,该数据集是一个回归问题。每个类的观察值数量是均等的,波士顿数据集506个样本,13个特征变量。
CRIM:城镇人均犯罪率。
ZN:住宅用地超过 25000 sq.ft. 的比例。
INDUS:城镇非零售商用土地的比例。
CHAS:查理斯河空变量(如果边界是河流,则为1;否则为0)。
NOX:一氧化氮浓度。
RM:住宅平均房间数。
AGE:1940 年之前建成的自用房屋比例。
DIS:到波士顿五个中心区域的加权距离。
RAD:辐射性公路的接近指数。
TAX:每 10000 美元的全值财产税率。
PTRATIO:城镇师生比例。
B:1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例。
LSTAT:人口中地位低下者的比例。
MEDV:自住房的平均房价,以千美元计。
数据集可视化
2.Ridge
对于数据集的线性回归处理我使用岭回归ridge,岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
其参数为:
Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=1e-3, solver=”auto”, random_state=None)
alpha:正则化力度,必须是一个正浮点数。正则化提升了问题的条件,减少了估计器的方差。较大的值指定了更强的正则化。
fit_intercept:是否计算该模型的截距。如果设置为False,将不会在计算中使用截距(比如,预处理数据已经中心化)
normalize:当fit_intercept设置为False时,该参数将会被忽略。如果为True,则回归前,回归变量X将会进行归一化,减去均值,然后除以L2范数。
copy_X:如果是True,x将被复制,否则,有可能被覆盖。
max_iter:共轭梯度求解器的最大迭代次数。对于‘sparse_cg’ 和 ‘lsqr’ 求解器,默认值由 scipy.sparse.linalg确定。对于‘sag’求解器,默认值是1000。
tol:求解方法精度
solver:计算例程中使用的求解程序
random_state :在对数据进行变换时使用伪随机数生成器的种子。如果int, random_state是随机数生成器使用的种子;如果随机状态实例,random_state是随机数发生器;如果没有,随机数生成器就是np.random使用的随机状态实例。当solver == ’ sag ‘时使用。
3.实验代码
import sklearn.datasets as datasets
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
import numpy as np
import pandas as pd
import math
from sklearn import metrics
def show(train, target, feature):
lists = list(feature)
facvals = [ [train[i][index] for i in range(len(train))] for index in range(len(lists)) ]
lists.append('TARGET')
facvals.append(target)
factor_dict = dict(zip(lists,facvals))
boston_df = pd.DataFrame(
factor_dict, # columns = ['CRIM','CHAS','AGE','TARGET'],
)
for i in range(len(lists)):
index = i+1
factor = lists[i]
plt.subplot(3,5,index)
plot(boston_df,factor)
plt.show()
def plot(boston_df,strfac):
x_axis = list(boston_df[strfac])
y_axis = list(boston_df['TARGET'])
plt.title(strfac)
plt.ylabel('Price')
plt.scatter(x_axis,y_axis,s=3)
def show_pre(y_test,y_predict):
plt.figure()
x=np.arange(0,len(y_test))
res=np.argsort(y_predict)
y_test= [y_test[i] for i in res]
y_predict.sort(axis=0)
print(type(y_predict))
plt.scatter(x, y_test, s=60, c='black', marker='.', alpha=1)
plt.plot(x, y_predict, c='red')
plt.title('the chang of house price')
plt.xlabel('x')
plt.ylabel('house price')
plt.legend(['real','predict'])
plt.show()
def predict(train,target,ridge):
X_train,x_test,y_train,y_true = train_test_split(train,target,test_size=0.2)
ridge.fit(X_train, y_train)
print("拟合优度",ridge.score(X_train, y_train)) # R^2,拟合优度
y_pre_ridge = ridge.predict(x_test)
plt.plot(y_pre_ridge,label='pre_ridge')
plt.plot(y_true,label='real')
plt.title('the chang of house price')
plt.legend()
plt.show()
show_pre(y_true,y_pre_ridge)
#准确率
score=ridge.score(x_test,y_true)
print(score)
#均方误差是指参数估计值与参数真值之差平方的期望值;MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
print("MSE:",metrics.mean_squared_error(y_true, y_pre_ridge))
#均方误差:均方根误差是均方误差的算术平方根
print("RMSE:",np.sqrt(metrics.mean_squared_error(y_true, y_pre_ridge)))
print(ridge.get_params()) # 获取参数信息
print ('alpha的数值 : ', ridge.alpha)
print ('参数的数值:', ridge.coef_)
alpha1 = [0.0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0]
ridge = Ridge(alpha=alpha1[3], solver='auto', tol=0.001)
#ridge = Ridge(alpha=2.0, copy_X=True, fit_intercept=True, max_iter=None, normalize=False, random_state=None, solver='auto', tol=0.001)
boston = datasets.load_boston()
print(boston.keys())
print(boston.data.shape)
feature = boston.feature_names
print(feature)
train = boston.data
target = boston.target
show(train,target,feature)
predict(train,target,ridge)
4.实验结果与分析
通过选择训练集与测试集之间的比例,实验发现当测试集占百分之二十时拟合优度最高,所有选用0.2
不同的alpha对模型参数w的影响程度。alpha越大,则w的数值上越小;alpha越小,则w的数值上越大。riidge在其他参数为默认时,随着alpha参数变话导致实验指标变化如下表所示
通过数据对比,在alpha为0.8时为score最高值,MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
alpha为0.6时MSE为最小值,RMSE均方根误差是均方误差的算术平方根,alpha为0.6时RMSE为最小值,综合上述,alpha在0.6时score也很高,所以最后alpha取0.6
折线图
散点图
通过折线图和散点图可以发现预测的房价趋势基本与实际的房价基本一致,在某些时刻也没有发生太大 的偏差