【机器学习入门】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不是参数类型,并且可以解决分类和回归问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个广泛应用于机器学习的深度学习框架,而线性回归机器学习中的一种基本模型。在线性回归中,我们使用数理统计中的回归分析来确定两种或两种以上变量之间的定量关系。具体来说,在PyTorch中实现线性回归可以使用nn.Linear类,在这个类中定义了全连接层。通过传递参数到nn.Linear中,我们可以指定输入特征的形状和输出特征的形状。例如,通过使用nn.Sequential(nn.Linear(2, 1)),我们可以定义一个具有输入特征形状为2,输出特征形状为1的线性回归模型。接下来,我们可以使用损失函数来衡量预测值与真实值之间的差距,常用的损失函数有均方差损失函数和平均绝对误差损失函数等。然后,我们可以使用优化算法(如梯度下降)来更新模型参数,以最小化损失函数并提高模型的预测性能。这样就可以完成PyTorch中的线性回归机器学习任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基础线性回归的PyTorch实现 PyTorch框架入门案例](https://download.csdn.net/download/didi_ya/37378255)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Pytorch实现机器学习线性回归](https://blog.csdn.net/rothschild666/article/details/123387737)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Pytorch 线性回归](https://blog.csdn.net/qq_39906884/article/details/124141176)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值