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

机器学习之线性回归算法

作者: 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)

相关文章

  • 2019-10-29

    Day2 简单线性回归模型 机器学习入门--简单线性回归机器学习算法之线性回归算法 导入库matplotlib 绘...

  • Python编写线性回归算法

    Python编写线性回归算法 前言 线性回归(Linear Regression)是机器学习的基础,作为机器学习算...

  • 《机器学习(周志华)》学习笔记(三)

    Q:机器学习中最简单的学习算法是什么? A:最简单的机器学习算法莫过于线性回归算法了。线性回归算法的基本形式如下:...

  • 机器学习算法的优缺点

    机器学习算法的优缺点 机器学习算法的优缺点 线性回归 Linear Regression 逻辑回归 Logisti...

  • 回归算法学习

    回归算法是机器学习中的经典算法之一,本文是对学习线性回归和逻辑回归算法进行的总结,线性回归与逻辑回归算法解决的分别...

  • 线性回归

    线性回归是机器学习算法的入门,通过该算法,管中窥豹,研究该算法的精髓之处。 线性回归 线性回归的损失函数为最小二乘...

  • Python 机器学习算法一之线性回归的推导及实战

    线性回归是机器学习中最基本的算法了,一般要学习机器学习都要从线性回归开始讲起,本节就对线性回归做一个详细的解释。 ...

  • Python 机器学习算法一之线性回归的推导及实战!

    线性回归是机器学习中最基本的算法了,一般要学习机器学习都要从线性回归开始讲起,本节就对线性回归做一个详细的解释。 ...

  • 常见回归算法

    sklearn作为机器学习中一个强大的算法包,内置了许多经典的回归算法。 线性回归 线性回归拟合一个带系数的线性模...

  • 线性回归算法

    前言 机器学习第二个基础的算法。跟上一篇博客类似这一遍博客会深入讨论线性回归的细节问题。 线性回归算法 线性回归算...

网友评论

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

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