当前位置:   article > 正文

Linear Regression(多变量) Task4_linearregression模型多变量代码

linearregression模型多变量代码

1. 波士顿房产数据(完整数据)
波士顿房产数据
使用sklearn.datasets.load_boston即可加载相关数据。该数据集是一个回归问题。每个类的观察值数量是均等的,共有 506 个观察,13 个输入变量和1个输出变量。

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. 实现多变量(手写代码)

#读取数据
%matplotlib notebook

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np                           
import pandas as pd                       #能快速读取常规大小的文件。Pandas能提供高性能、易用的数据结构和数据分析工具
from sklearn.utils import shuffle             #随机打乱工具,将原有序列打乱,返回一个全新的顺序错乱的值

#读取数据文件
df = pd.read_csv("data/boston.csv",header=0)

#显示数据描述信息
# print(df.describe())
# print(df)


#数据准备

#获取df的值
df = df.values

#把df转换成np的数组格式
df = np.array(df)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

3. 数据标准化(手写代码)

#特征数据归一化
#对特征数据{0到11}列 做(0-1)归一化
for i in range(12):
    df[:,i] = (df[:,i]-df[:,i].min())/(df[:,i].max()-df[:,i].min())
    
#x_data为归一化后的前12列特征数据
x_data = df[:,:12]

#y_data为最后1列标签数据
y_data = df[:,12]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4. 网格搜索调参
GridSearch
网格化调整超参数所需要做的是告诉GridSearchCV要试验有哪些超参数,要试验什么值,GridSearchCV就能用交叉验证试验所有可能超参数值的组合。
比如下面对随机森林的网格化调参:

grid_search.best_estimator_
grid_search.best_params_
#在得到相应的分数
housing_predictions = grid_search.predict(housing_prepared)
scores = cross_val_score(grid_search,housing_prepared,housing_labels.values,scoring="neg_mean_squared_error", cv=5)
grid_score= np.sqrt(-scores)
display(grid_score)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
输出得到最优参数后,我们可以代入到原来的模型中然后进行计算:

rnd_clffited = RandomForestRegressor(n_estimators=30,max_features=6,random_state=42)
 
scores = cross_val_score(rnd_clffited,housing_prepared,housing_labels.values,scoring="neg_mean_squared_error", cv=5)
rnd_clfscore= np.sqrt(-scores)
display(rnd_clfscore)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

现在在给一个支持向量机的调参方式:

from sklearn.model_selection import GridSearchCV
param_grid = [
        {'kernel': ['linear'], 'C': [10., 30., 100., 300., 1000., 3000., 10000., 30000.0]},
        {'kernel': ['rbf'], 'C': [1.0, 3.0, 10., 30., 100., 300., 1000.0],
         'gamma': [0.01, 0.03, 0.1, 0.3, 1.0, 3.0]},
    ]
svm_reg = SVR()
grid_search = GridSearchCV(svm_reg, param_grid, cv=5, scoring='neg_mean_squared_error', verbose=2, n_jobs=4)
grid_search.fit(housing_prepared, housing_labels)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里的scoring 就是sklearn metric中的一些评估指标。
这里的参数列表我们可以研究一下:
这里的交叉验证参数是分别尝试线性核 和rbf 核 ,如gama = 0.1 kernel =‘linear’,‘C’ = 10 ,gama = 0.1 kernel =‘linear’,‘C’ = 10 共(86+76)*5 这里之所以乘以5 是因为 grid_search 里的cv =5

5. from sklearn.linear_model import LinearRegression对比
sklearn中的线性回归模型LinearRegression()是使用最小二乘法来实现的。

##加载线性回归模型
model=LinearRegression()
##将训练数据传入开始训练
model.fit(X_train,y_train)
print(model.coef_)     #系数,有些模型没有系数(如k近邻)
print(model.intercept_) #与y轴交点,即截距
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出:

[[-0.01759158  4.3701041  -0.94665828 -0.60046412]]
[ 20.27487956]
  • 1
  • 2

官网上还有提到Ridge Regression,我们也来试一试,它其实就是在最小二乘法的基础上对系数的L2范数的平方加了一个λλ惩罚项。
对于普通的线性回归,我们的算法思路是:minw||wX−y||22minw||wX−y||22此处为L2范数的平方此处为L2范数的平方
对于Ridge Regression,它的思路是:在这里插入图片描述

导入Ridge Regression模型:

model_ridge=linear_model.Ridge(alpha = .5)
model_ridge.fit(X_train,y_train)
print(model_ridge.coef_)
print(model_ridge.intercept_)
  • 1
  • 2
  • 3
  • 4

输出:

[[-0.01757544  4.35451637 -0.94714198 -0.6012894 ]]
[ 20.39189661]
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/842039
推荐阅读
相关标签
  

闽ICP备14008679号