【机器学习入门】5、线性回归算法

多图预警!!!!由于,本章联系到的数学公式不好列,只能截取视频中的公式!!!!!!

特点

思路简单
解决回归问题
结果具有可解释性
蕴含机器学习中许多重要思想
在这里插入图片描述

简单线性回归

样本特征只有一个
最佳拟合方程:
y=ax+b
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
典型的最小二乘法:最小化误差的平方
在这里插入图片描述
具体推导过程略

简单线性回归的实现
以下是代码实现,如果有些地方不懂可以先看下面的内容。

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split as tts
class SimpleLinearRegression:
    def __init__(self):
        self.a_=0
        self.b_=0
    
    def fit(self,X_train,y_train):
        X_mean=np.mean(X_train)
        y_mean=np.mean(y_train)
        
        sum1=(X_train-X_mean).dot(y_train-y_mean)
        sum2=(X_train-X_mean).dot(X_train-X_mean)
        self.a_=sum1/sum2
        self.b_=y_mean-X_mean*self.a_
        return self
    def predict(self,x_predict):
        return np.array([self.predict_single(x) for x in x_predict])
    
    def predict_single(self,x_single):
        return self.a_*x_single+self.b_

if __name__=='__main__':
    boston=datasets.load_boston()
    x=boston.data[:,5]
    y=boston.target
    x=x[y<50.0]#去除不利
    y=y[y<50.0]
    X_train,X_test,y_train,y_test =tts(x,y,random_state=666)
    plt.scatter(X_train,y_train)
    
    slr=SimpleLinearRegression()
    slr.fit(X_train,y_train)
    print(slr.a_)
    print(slr.b_)
    plt.plot(X_train,slr.predict(X_train),color='r')
    plt.show()
    y_predict=slr.predict(X_test)
  
    rmse=np.sqrt(np.sum((y_predict-X_test)**2)/len(y_predict))
    print(rmse)

计算a和b:
在这里插入图片描述
在这里插入图片描述
向量计算
将a拆开为两个向量点乘,得到性能的巨大提升

num =(x_train-x_mean).dot(y_train-y_mean)
d = (x_train-x_mean).dot(x_train-x_mean)
a=num/d

衡量线性回归法的指标
在这里插入图片描述
在这里插入图片描述
MSE
在这里插入图片描述
RMSE
将MSE开方,取得和数据一样的量纲,代表和真实数据的误差值
在这里插入图片描述
MAE
量纲和原数据相同

MAE = np.sum(np.absolute(y_predict-y_test))/len(y_test)  # y是测试数据集

在这里插入图片描述
RMSE和MAE的比较
RMSE有取平方的操作,有放大了差距的趋势,而MAE没有。
我们在训练数据时的目的就是让最大的误差减小,所以我们训练时尽量让RMSE最小,从而一般我们选取RMSE作为衡量标准

最好的衡量标准R Squared

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
推算:
在这里插入图片描述
即:

RS = 1 - MSE/np.var(y_test)

在这里插入图片描述
并且在sklearn中用score默认就使用了r2_score

多元线性回归

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:这里的数学推导可以先不做了解,知道公式就好

在这里插入图片描述
在这里插入图片描述
具体实现:

import numpy as np
from sklearn.metrics import r2_score
from sklearn import datasets
from sklearn.model_selection import train_test_split as tts


class LinearRegression:
    def __init__(self):
        self.coef_ = None # 系数列表
        self.interception_ = None  # 截距
        self._theta = None 
        
    def fit(self,X_train,y_train):
        """根据训练数据集,训练模型"""
        X_b = np.hstack([np.ones((len(X_train),1)),X_train])
        
        self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)
        self.interception_ = self._theta[0]
        self.coef_ = self._theta[1:]
        return self
    
    def predict(self,X_predict):
        """给定待遇测数据集,返回相应的结果向量"""
        X_b = np.hstack([np.ones((len(X_predict),1)),X_predict])
        return X_b.dot(self._theta)
    
    def score(self, X_test, y_test):
        y_predict = self.predict(X_test)        
        return r2_score(y_test,y_predict)
    
    
if __name__ == '__main__':
    boston=datasets.load_boston()
    x=boston.data
    y=boston.target
    x=x[y<50.0]#去除不利
    y=y[y<50.0]
    X_train,X_test,y_train,y_test =tts(x,y,random_state=666)
    
    lr=LinearRegression()
    lr.fit(X_train,y_train)
  
    print(lr.coef_)
    print(lr.interception_)
    print(lr.score(X_test, y_test))

sklearn中使用线性回归

from sklearn.linear_model import LinearRegression    
lr = LinearRegression()
lr.fit(X_train,y_train)
print(lr.score(X_test, y_test))

答案和上面一样,为80%多点

knn算法解决回归问题

from sklearn.neighbors import KNeighborsRegressor    
knr = KNeighborsRegressor()
knr.fit(X_train,y_train)
print(knr.score(X_test, y_test))

需要对此算法进行超参数的网格搜索

from sklearn.neighbors import 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,11)]
                }
        ]
knr = KNeighborsRegressor()
grid_search = GridSearchCV(knr,param_grid,n_jobs=-1,verbose=1)
grid_search.fit(X_train,y_train)
print(grid_search.best_estimator_.score(X_test,y_test))

在这里插入图片描述
效果没有直接线性回归好

总结

在这里插入图片描述

线性回归算法是典型的参数学习,并且只能用于回归问题,而kNN不是参数类型,并且可以解决分类和回归问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值