波士顿房价预测2(多元线性回归)

模型思想

多元线性回归(multiple linear regression) 模型的目的是构建一个回归方程,利用多个自变量估计因变量,从而解释和预测因变量的值。多元线性回归模型中的因变量和大多数自变量为定量值,某些定性指标需要转换为定量值才能应用到回归方程中。

意义

事物的联系也是多方面的,而影响事物发展的因素是多样的。由多个自变量的最优组合共同来估计因变量,比单一的自变量预测更有效,更符合实际。
比如糖尿病人的血糖变化可能受胰岛素、糖化血红蛋白、血清总胆固醇、甘油三酯等多种指标的影响。但很多情况下,由于自变量的单位是不一样的,需要做标准化处理。比如在消费水平预测模型中,工资水平、受教育程度、职业、地区、家庭负担等因素都会影响到消费水平,而这些影响因素的单位和量级肯定是不同的,虽然不会影响自变量的重要程度,但是对回归系数的大小还是有直接影响作用的。标准化回归系数没有单位,其值越大,说明该自变量对因变量的影响越大。

https://www.jianshu.com/p/2ce27e88d78c

1.加载数据集并试着分析特征

from sklearn.datasets import load_boston
boston = load_boston()
print(boston.DESCR)

Boston House Prices dataset
===========================
Notes


Data Set Characteristics:
:Number of Instances: 506
:Number of Attributes: 13 numeric/categorical predictive
:Median Value (attribute 14) is usually the target
:Attribute Information (in order):

  • CRIM per capita crime rate by town
  • ZN proportion of residential land zoned for lots over 25,000 sq.ft.
  • INDUS proportion of non-retail business acres per town
  • CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
  • NOX nitric oxides concentration (parts per 10 million)
  • RM average number of rooms per dwelling
  • AGE proportion of owner-occupied units built prior to 1940
  • DIS weighted distances to five Boston employment centres
  • RAD index of accessibility to radial highways
  • TAX full-value property-tax rate per $10,000
  • PTRATIO pupil-teacher ratio by town
  • B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
  • LSTAT % lower status of the population
  • MEDV Median value of owner-occupied homes in $1000's


查看数据集的关键字

boston.keys()
#dict_keys(['data', 'target', 'feature_names', 'DESCR'])

1.2 将数据集转化为dataframe

bostonDf_X = pd.DataFrame(boston.data,columns=boston.feature_names)
bostonDf_y = pd.DataFrame(boston.target,columns=['houseprice'])#注意加列名称

#合并dataframe
bostonDf = pd.concat([bostonDf_X,bostonDf_y],axis=1)#axis=1为横向操作
bostonDf.shape#(506, 14)
bostonDf.head() #看一下数据集

然后对整体数据进行大致分析

print("最大值:",np.max(boston.target))
print("最小值:",np.min(boston.target))
print("平均值:",np.mean(boston.target))
bostonDf.describe()

最大值: 50.0
最小值: 5.0
平均值: 22.532806324110677

然后对其中一些字段进行特征分析

1.2.1 CRIM分析

plt.scatter(df['CRIM'], y)
plt.title('城镇人均犯罪率与房价散点图')
plt.xlabel('城镇人均犯罪率')
plt.ylabel('房价')
plt.show()

1.2.2 RM分析

先对要重复出现的代码进行封装

def drawScatter(x, y, xlabel):
    plt.scatter(x, y)
    plt.title('%s与房价散点图' %xlabel)
    plt.xlabel(xlabel)
    plt.ylabel('房价')
    plt.yticks(range(0,60,5))
    plt.grid()
    plt.show()

同样的可以画出其他因素与房价之间关系的散点图


1.3对数据进行正规化处理

使用sklearn中的StandardScaler进行处理

#进行数据预处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
#将数据归化到正态分布,均值为0,方差为1
bostonStd_1 = scaler.fit_transform(bostonDf.values)
showbostonStd_1 = pd.DataFrame(bostonStd_1,columns=bostonDf.columns)
showbostonStd_1.head(10)

1.4 对数据集进行切分

x_train,x_test,y_train,y_test = train_test_split(bostonStd_1[:,[0,13]],bostonStd_1[:,[13]],test_size=0.3,random_state=0)

1.5建立模型进行预测

#进行建模
from sklearn.linear_model import LinearRegression
regr = LinearRegression()
regr.fit(x_train,y_train)

y_pred = regr.predict(x_test)
regr.score(x_test,y_test)

此时得到的score为1.0,可能过拟合,之后将使用网格调参进行优化处理

regr.coef_ #看一下此时的权重
array([[-1.19858618e-01,  4.44233009e-02,  1.18612465e-02,
         2.51295058e+00, -1.62710374e+01,  3.84909910e+00,
        -9.85471557e-03, -1.50002715e+00,  2.41507916e-01,
        -1.10671867e-02, -1.01897720e+00,  6.95273216e-03,
        -4.88110587e-01]])

由此可以得知第七个因素对房价负增长的影响最大(1940年以前建成的业主自住单位的占比),而第12个因素对房价的增长影响最大(黑人比例!?)

1.6计算评价指标

#根据公式计算结果
mse_test = np.sum((y_pred-y_test)**2)/len(y_test)
mae_test = np.sum(np.absolute(y_pred-y_test))/len(y_test)
rmse_test = mse_test**0.5
r2_score = 1-(mse_test/np.var(y_test))
print("r2_score为:",r2_score)
print("mae为:",mae_test)
print("mse为:",mse_test)
print("rmse为:",rmse_test)

r2_score为: 1.0
mae为: 4.269359902158972e-16
mse为: 3.4968787098127684e-31
rmse为: 5.913441223021303e-16

2.使用网格搜索进行调参

网格搜索是一种调参手段;穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫grid search)
通过调用sklearn中的grid_search.GridSearchCV来完成

#k近邻网络搜索来进行调参
from sklearn.grid_search import GridSearchCV
from sklearn.neighbors import KNeighborsRegressor

knn_reg = KNeighborsRegressor()
grid_param = [
    {
        'weights':['uniform'],
        'n_neighbors':[i for i in range(1,11)]
    },
    {
        'weights':['distance'],
        'n_neighbors':[i for i in range(1,11)],
         'p':[i for i in range(1,6)]
    }
]
knn_reg = KNeighborsRegressor()
grid_search = GridSearchCV(knn_reg,grid_param,n_jobs=-1,verbose=2,cv=10)
# 调用fit方法执行网格搜索
grid_search.fit(x_train,y_train.astype('int'))

print(grid_search.best_params_)
print(grid_search.best_score_)
print(grid_search.best_estimator_.score(x_test,y_test))

得到

{'n_neighbors': 3, 'p': 1, 'weights': 'distance'}
0.9397867256628897
#在测试集上的最高分数
0.7577379984560788
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容