美文网首页
机器学习之线性回归算法

机器学习之线性回归算法

作者: Sunshine丶宇天 | 来源:发表于2019-08-27 23:04 被阅读0次

    前言

    线性回归形式简单、易于建模,但却蕴涵着机器学习中一些重要的基本思想。许多功能更为强大的非线性模型(nonlinear model)可在线性模型的基础上通过引入层级结构或高维映射得来的。此外,由于线性回归的解𝜃直观表达了各属性在预测中的重要性,因此线性回归有很好的可解释性。

    什么是线性回归?

    线性回归,就是能够用一个直线较为精确地描述数据之间的关系。这样当出现新的数据的时候,就能够预测出一个简单的值。如下图所示:
    找一条直线最大程度的拟合样本的特征点


    拟合直线1.png

    简单线性回归

    我们讨论一种最简单的情形:输入的特征数目只有一个。
    线性回归试图使得:y = ax + b


    拟合直线2.png

    假设我们找到了最佳拟合的直线方程:
    y = ax + b
    则对于每一个样本点x(i)
    根据我们的直线方程,预测值为:
    y'(i) = ax(i) + b
    真值为:y(i)
    我们希望y(i)y'(i)的差距尽量小

    目标函数.png
    则有:
    公式化简.png

    简单线性回归算法实现代码如下:

    import numpy as np
    from .metrics import r2_score
    
    
    class SimpleLinearRegression:
    
        def __init__(self):
            """初始化Simple Linear Regression模型"""
            self.a_ = None
            self.b_ = None
    
        def fit(self, x_train, y_train):
            """根据训练数据集x_train, y_train训练Simple Linear Regression模型"""
            assert x_train.ndim == 1, \
                "Simple Linear Regressor can only solve single feature training data."
            assert len(x_train) == len(y_train), \
                "the size of x_train must be equal to the size of y_train"
    
            x_mean = np.mean(x_train)
            y_mean = np.mean(y_train)
    
            self.a_ = (x_train - x_mean).dot(y_train - y_mean) / (x_train - x_mean).dot(x_train - x_mean)
            self.b_ = y_mean - self.a_ * x_mean
    
            return self
    
        def predict(self, x_predict):
            """给定待预测数据集x_predict,返回表示x_predict的结果向量"""
            assert x_predict.ndim == 1, \
                "Simple Linear Regressor can only solve single feature training data."
            assert self.a_ is not None and self.b_ is not None, \
                "must fit before predict!"
    
            return np.array([self._predict(x) for x in x_predict])
    
        def _predict(self, x_single):
            """给定单个待预测数据x,返回x的预测结果值"""
            return self.a_ * x_single + self.b_
    
        def score(self, x_test, y_test):
            """根据测试数据集 x_test 和 y_test 确定当前模型的准确度"""
    
            y_predict = self.predict(x_test)
            return r2_score(y_test, y_predict)
    
        def __repr__(self):
            return "SimpleLinearRegression()"
    
    

    多元线性回归

    输入的特征数目是多个的时候,多元线性回归方程:y=θ0 + θ1x1 + θ2x2 + … +θnxn
    则对于每一个样本点x(i)
    根据我们的直线方程,预测值为:
    y'(i) = θ0 + θ1x1 + θ2x2 + … + θnxn
    真值为:y(i)
    我们希望y(i)y'(i)的差距尽量小

    多元线性回归目标函数.png
    推导公式化简:
    公式推导1.png
    公式推导2.png
    多元线性回归算法实现代码如下:
    import numpy as np
    from .metrics import r2_score
    
    class LinearRegression:
    
        def __init__(self):
            """初始化Linear Regression模型"""
            self.coef_ = None
            self.intercept_ = None
            self._theta = None
    
        def fit_normal(self, X_train, y_train):
            """根据训练数据集X_train, y_train训练Linear Regression模型"""
            assert X_train.shape[0] == y_train.shape[0], \
                "the size of X_train must be equal to the size of 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.intercept_ = self._theta[0]
            self.coef_ = self._theta[1:]
    
            return self
    
        def predict(self, X_predict):
            """给定待预测数据集X_predict,返回表示X_predict的结果向量"""
            assert self.intercept_ is not None and self.coef_ is not None, \
                "must fit before predict!"
            assert X_predict.shape[1] == len(self.coef_), \
                "the feature number of X_predict must be equal to X_train"
    
            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):
            """根据测试数据集 X_test 和 y_test 确定当前模型的准确度"""
    
            y_predict = self.predict(X_test)
            return r2_score(y_test, y_predict)
    
        def __repr__(self):
            return "LinearRegression()"
    

    评价模型

    MSE (Mean Squared Error)叫做均方误差

    均方误差.png

    RMSE(Root Mean Squard Error)均方根误差。

    均方根误差.png

    MAE(Mean Absolute Error)平均绝对误差


    平均绝对误差.png

    r2_score(R Squared)


    r2_score.png

    线性回归算法的评测metrics.py实现代码如下:

    import numpy as np
    from math import sqrt
    
    
    def accuracy_score(y_true, y_predict):
        """计算y_true和y_predict之间的准确率"""
        assert len(y_true) == len(y_predict), \
            "the size of y_true must be equal to the size of y_predict"
    
        return np.sum(y_true == y_predict) / len(y_true)
    
    
    def mean_squared_error(y_true, y_predict):
        """计算y_true和y_predict之间的MSE"""
        assert len(y_true) == len(y_predict), \
            "the size of y_true must be equal to the size of y_predict"
    
        return np.sum((y_true - y_predict)**2) / len(y_true)
    
    
    def root_mean_squared_error(y_true, y_predict):
        """计算y_true和y_predict之间的RMSE"""
    
        return sqrt(mean_squared_error(y_true, y_predict))
    
    
    def mean_absolute_error(y_true, y_predict):
        """计算y_true和y_predict之间的RMSE"""
        assert len(y_true) == len(y_predict), \
            "the size of y_true must be equal to the size of y_predict"
    
        return np.sum(np.absolute(y_true - y_predict)) / len(y_true)
    
    
    def r2_score(y_true, y_predict):
        """计算y_true和y_predict之间的R Square"""
    
        return 1 - mean_squared_error(y_true, y_predict)/np.var(y_true)
    

    相关文章

      网友评论

          本文标题:机器学习之线性回归算法

          本文链接:https://www.haomeiwen.com/subject/rwqyectx.html