回归算法--多元线性回归


一.什么是多元线性回归

在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。

 

二.多元线性回归的一些推导过程

 

 

 

 

 

三.使用代码来实现多元线性回归

import numpy as np 
import matplotlib.pyplot as plt
from sklearn import datasets

#加载数据集
boston=datasets.load_boston()
X = boston.data
y = boston.target
X = X[y < 50.0]
y = y[y < 50.0]


#加载自己的模块
from playML.LinearRegression import LinearRegression
reg = LinearRegression()  #实例化过程

reg.fit_normal(X_train,y_train) #训练数据集的过程

reg.coef_ #查看相应的特征属性值
'''
array([-1.18919477e-01,  3.63991462e-02, -3.56494193e-02,  5.66737830e-02,
       -1.16195486e+01,  3.42022185e+00, -2.31470282e-02, -1.19509560e+00,
        2.59339091e-01, -1.40112724e-02, -8.36521175e-01,  7.92283639e-03,
       -3.81966137e-01])
'''

reg.intercept_ #截距:34.16143549624022

reg.score(x_test,y_test)  #查看算法的准确性 :0.8129802602658537  

 三.使用sklearn实现多元线性回归

1.使用linear_model的LinearRegression模块来解决

import numpy as np 
import matplotlib.pyplot as plt
from sklearn import datasets

#加载数据
boston=datasets.load_boston()

X = boston.data
y = boston.target

#数据预处理过程,去掉边界上的点
X = X[y < 50.0]
y = y[y < 50.0]

#采用自己写的分割方法对原始数据进行分割,分割成为训练数据和测试数据
from playML.model_selection import train_test_split
X_train,x_test,y_train,y_test=train_test_split(X,y,seed=666)

#导入相应的模块
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)

#特征参数的值
lin_reg.coef_

'''
array([-1.18919477e-01,  3.63991462e-02, -3.56494193e-02,  5.66737830e-02,
       -1.16195486e+01,  3.42022185e+00, -2.31470282e-02, -1.19509560e+00,
        2.59339091e-01, -1.40112724e-02, -8.36521175e-01,  7.92283639e-03,
       -3.81966137e-01])
'''

#截距
lin_reg.intercept_  #34.16143549624665


#测试算法的准确度 R Squared
lin_reg.score(x_test,y_test)  #0.8129802602658495

2.使用knn算法来解决回归问题

1.采用系统默认的参数来进行knn测试算法的精确度

#采用系统默认的参数来进行相关的测试
from sklearn.neighbors import KNeighborsRegressor
knn_reg = KNeighborsRegressor()
knn_reg.fit(X_train,y_train)
knn_reg.score(x_test,y_test)

#0.5865412198300899

2.使用knn进行网格搜索,找到最优参数,并测出算法的精确度

from sklearn.neighbors import KNeighborsRegressor
knn_reg = KNeighborsRegressor()

from sklearn.model_selection import GridSearchCV
param_grid = [
    {
        '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,param_grid,n_jobs=-1,verbose=2)
grid_search.fit(X_train,y_train)


#最优超参数
grid_search.best_params_
#{'n_neighbors': 5, 'p': 1, 'weights': 'distance'}

#使用最优超参数得到的算法精确度
grid_search.best_estimator_.score(x_test,y_test)
#0.7044357727037996

3.两种方式的对比

在上述两种方法中,看上去第一种方法的精确度比第二中方法的精确度要高,但是我们能说第一种算法的精确度比第二种方法的精确度好吗?答案是否定的,因为两种方法的精确度的计算方法是不一样的,比较的指标参数也是不一样的,因此,我们不能武断的下结论说算法一比第二种算法的精确度高。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM