机器学习实践系列2——多项式回归

摘要:本文主要结合实际案例介绍多项式回归, 多项式回归主要包括一元多项式回归和多元多项式回归,本文主要介绍的是一元多项式回归。

在一元回归分析中,如果自变量x和因变量y之间的关系是非线性的,在找不到合适的函数曲线来拟合的情况下,可以采用一元多项式回归。如果自变量不止一个,则采用多元多项式回归。
多项式回归可以处理相当一类非线性问题,因为任意函数都可以分段,用多项式来逼近。

本文采用的案例数据为杭州西溪板块的二手房价信息,数据是用集搜客(GooSeeker)爬虫工具用从链家官网爬取的。为了说明多项式回归,对部分房价数据做了修改。

读取并观察数据:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
data = pd.read_csv('house_price.csv')
data.describe()
#观察数据,发现离群数据size = 853.65,处理
data = data[data['size']<= 500]
data.describe()

我们用散点图分别查看“单价”、“总价”和“大小”的关系:

#大小和单价的关系
fig = plt.figure(figsize=(6,4))
T = np.arctan2(data['size'],data['price'])
plt.scatter(data['size'],data['price'], c=T)
plt.xlabel('size')
plt.ylabel('price')
plt.show()
#大小和总价的关系
fig = plt.figure(figsize=(6,4))
T2 = np.arctan2(data['size'],data['total_price'])
plt.scatter(data['size'],data['total_price'], c=T2)
plt.xlabel('size')
plt.ylabel('total_price')
plt.show()

可以看到,总价和大小之间呈现更明显的相关性。我们分别以【大小】和【总价】做为输入变量和输出变量,说明多项式回归的应用。

在进行建模之前,我们先把数据集拆分为训练集和测试集。Scikit-learn中提供了拆分数据集的函数train_test_split用来做较差验证。

#拆分数据集为训练集和测试集
from sklearn.cross_validation import train_test_split

xtrain, xtest, ytrain, ytest = train_test_split(data['size'], data['total_price'])
xtrain = xtrain.reshape(len(xtrain),1)
ytrain = ytrain.reshape(len(ytrain),1)
xtest = xtest.reshape(len(xtest),1)
ytest = ytest.reshape(len(ytest),1)

一元线性回归

为了对比,我们首先用一元线性回归模型来描述【大小】和【总价】之间的关系。

#构建一元线性回归模型
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(xtrain, ytrain)
plt.scatter(xtrain, ytrain)
plt.plot(xtest, lr.predict(xtest), 'g-')

可以看到,一元线性回归模型并不能很好的拟合【大小】和【总价】数据,不能很好的描述两者之间的关系。
计算R^2,发现拟合优度也不太满意:

# 计算R方
r_score = lr.score(xtest,ytest)

R^2 = 0.75

一元多项式回归

Scikit-learn的preprocessing库中,提供了PolynomialFeatures类对数据进行多项式转换。

from sklearn.preprocessing import PolynomialFeatures
pol = PolynomialFeatures(degree = 2)

其中degree就是我们要处理的自变量的指数,如果degree = 1,就是普通的线性回归。

官方对degree的解释如下:

Generate polynomial and interaction features.
Generate a new feature matrix consisting of all polynomial combinations of the features with degree less than or equal to the specified degree. For example, if an input sample is two dimensional and of the form [a, b], the degree-2 polynomial features are [1, a, b, a^2, ab, b^2].

在处理多项式回归的过程中,需要使用fit_transform函数对训练集数据先进行拟合,然后再标准化,然后对测试集数据使用transform进行标准化,属于数据预处理的一种方法,后续文章中会再提到。

#对训练集进行拟合标准化处理
xtrain_pol = pol.fit_transform(xtrain)
#模型初始化
lr_pol = LinearRegression()
#拟合
lr_pol.fit(xtrain_pol, ytrain)
#对测试集进行重构
x = np.arange(min(xtest), max(xtest)).reshape([-1,1])

#预测及展示
plt.scatter(xtrain, ytrain)
plt.plot(x, lr_pol.predict(pol.transform(x)), c='red')

可以看到,多项式回归的拟合度比线性回归要好很多。我们计算一下R^2:

r_score_pol = lr_pol.score(pol.transform(xtest), ytest)

得到R^2 = 0.82099383118934888

对比线性回归的R^2值 = 0.75,可以看到,多项式回归的拟合效果比现行回归好很多。

我们把degree提升到3,执行同样的语句,得到如下曲线:

得到R^2 = 0.82082180554068496

再把degree提升到7,得到曲线如下:

得到R^2 = 0.81872364187726354

Degree R^2
1 0.7497565222717566
2 0.82099383118934888
3 0.82082180554068496
7 0.81872364187726354

可以看到,degree = 7的时候,虽然曲线经过的点更多,但R^2值更低,拟合度并没有更好,这种情况是记忆训练的结果,在训练集效果很好,但在测试集上效果就不好了,是一种过拟合(over-fitting)。所以需要注意的是,degree太高,容易出现过拟合问题。

一篇很好的理解fit_transformer和transformer的概念以及区别的blog

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

推荐阅读更多精彩内容