线性回归、岭回归

sklearn内置的波士顿房屋数据集做一下房价预测,练习线性回归的API。

  • 正规方程法
  • 梯度下降法
  • 岭回归

获取数据集

加载sklearnboston数据集,返回训练集、测试集、以及目标值标准化模型。

线性回归求目标值是对各特征加和,因此需要对数据做标准化处理。

def preprocess():
    # 获取数据
    boston = load_boston()
    print("feature_names:")
    print(boston.feature_names)
    print("data:")
    print(boston.data[:5])
    print("target:")
    print(boston.target[:5])

    # 划分训练集测试集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, test_size=0.25)

    # 线性回归需要对特征数据和目标数据进行标准化处理
    # 特征数据标准化
    std_x = StandardScaler()
    std_x.fit(x_train)
    x_train = std_x.transform(x_train)
    x_test = std_x.transform(x_test)

    # 目标数据标准化
    # StandardScaler的transform要求传入二维数据,故此处reshape
    y_train = y_train.reshape(-1, 1)

    std_y = StandardScaler()
    std_y.fit(y_train)
    y_train = std_y.transform(y_train)

    return x_train, x_test, y_train, y_test, std_y

输出:

****************************** 数据集 ******************************
feature_names:
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
data:
[[6.3200e-03 1.8000e+01 2.3100e+00 0.0000e+00 5.3800e-01 6.5750e+00
  6.5200e+01 4.0900e+00 1.0000e+00 2.9600e+02 1.5300e+01 3.9690e+02
  4.9800e+00]
 [2.7310e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 6.4210e+00
  7.8900e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9690e+02
  9.1400e+00]
 [2.7290e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 7.1850e+00
  6.1100e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9283e+02
  4.0300e+00]
 [3.2370e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 6.9980e+00
  4.5800e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9463e+02
  2.9400e+00]
 [6.9050e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 7.1470e+00
  5.4200e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9690e+02
  5.3300e+00]]
target:
[24.  21.6 34.7 33.4 36.2]

建模

正规方程法:

model = LinearRegression()
model.fit(x_train, y_train)

梯度下降法:

# max_iter: 最大迭代次数
model = SGDRegressor(max_iter=10)
model.fit(x_train, y_train.ravel())

岭回归:

# alpha: 正则化力度
model = Ridge(alpha=1.0)
model.fit(x_train, y_train.ravel())

预测

def predict(model, x_test, y_test, std_y):
    # 回归系数
    print("回归系数:")
    print(model.coef_)

    # 预测结果
    print("真实值:")
    print(y_test[:10])
    y_predict = model.predict(x_test)
    y_predict = std_y.inverse_transform(y_predict)
    print("预测值:")
    print(np.around(y_predict[:10].flatten(), decimals=1))

    print("均方误差:")
    print(mean_squared_error(y_test, y_predict))

输出:

****************************** 线性回归:正规方程法 ******************************
回归系数:
[[-0.06186526  0.13107583  0.04516768  0.05849482 -0.18127294  0.28983444
  -0.0302648  -0.32734363  0.28317058 -0.25426876 -0.24581878  0.0966923
  -0.41279297]]
真实值:
[34.9 20.6 24.1 37.2 12.8 25.  46.  14.5 21.5 22.9]
预测值:
[30.3 16.4 25.7 32.7 12.8 22.3 39.9 12.9 22.  20. ]
均方误差:
25.39621815792282
****************************** 线性回归:梯度下降法 ******************************
回归系数:
[-0.04176259  0.08606617 -0.01498182  0.06544983 -0.10239262  0.31993282
 -0.04230784 -0.25439308  0.1088705  -0.07597648 -0.22770765  0.09737765
 -0.37915806]
真实值:
[34.9 20.6 24.1 37.2 12.8 25.  46.  14.5 21.5 22.9]
预测值:
[31.  17.5 25.8 31.8 13.3 22.4 39.2 13.5 23.2 21.9]
均方误差:
25.956482620192624
****************************** 岭回归 ******************************
回归系数:
[-0.06091708  0.12885114  0.04121933  0.05930487 -0.17777864  0.2910496
 -0.03091966 -0.32345932  0.27206837 -0.24330282 -0.24454616  0.0965778
 -0.41066292]
真实值:
[34.9 20.6 24.1 37.2 12.8 25.  46.  14.5 21.5 22.9]
预测值:
[30.4 16.5 25.7 32.7 12.9 22.3 39.9 12.9 22.  20.1]
均方误差:
25.376589190071144

正规方程法适用于小数据集,100万条样本以下。
对于大数据集则建议使用梯度下降。
而岭回归加入了正则化,稳定性更好。

源码

Github: LinearRegression

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

推荐阅读更多精彩内容