Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >线性回归

线性回归

作者头像
听城
发布于 2018-04-27 06:17:03
发布于 2018-04-27 06:17:03
1.3K00
代码可运行
举报
文章被收录于专栏:杂七杂八杂七杂八
运行总次数:0
代码可运行

线性模型形式简单、易于建模,但却蕴含着机器学习中一些重要的基本思想。许多功能更为强大的非线性模型都可在线性模型的基础上引入层级结构或高维映射得到。

基本形式

给定由d个属性描述的示例x=(x1; x2;...;xd),其中xi是x是第i个属性上的取值,线性模型试图学得一个通过属性的线性组合来进行预测的函数,即f(x)=w1x1+w2x2+...wdxd+b,一般用向量形式写成f(x)=wTx+b,w和b学得之后模型就得以确定

线性回归

下面我们用一个预测房价的例子来说明。

选择合适模型

横轴为房屋大学,纵轴为房屋出售的价格。由上述可知,w1和w0是需要学得的参数。不同的参数会拟合成不同的直线。我们需要的是一条成本最小的直线,通常用RSS残差平方和来表示。

那如果我们用更高阶的函数来拟合这个数据呢?

二次函数

高阶函数

我们可以看到二次函数的RSS比一次稍好些,更高阶的函数则可以完全拟合给出的点,但是这种情况明显是不好的,因为过拟合了,太符合样本的特征了。

那如何来选择合适模型呢?如果给出的数据足够大,可以用下面方法取得更好的结果。

这其实就是我们通常用到的训练集和测试集。常用的方法有留出法、交叉验证法、自助法。这个在之前的文章中提到过,就不再赘述。

训练误差、测试误差和模型复杂度之间的关系

QQ截图20171109054124.png

当然这只是一个参数的情况,实际的情况肯定是多个参数。

整体流程

实际案例分析

读取数据集
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
df = pd.read_csv('house_data.csv')
df.head()
可视化房屋数据集的特征
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(context = 'notebook')
# 人口百分比,房屋建造时间,据市中心距离,犯罪率,房屋价格,税,房间数
cols = ['LSTAT', 'AGE', 'DIS', 'CRIM', 'MEDV', 'TAX', 'RM']
sns.pairplot(df[cols], size=2.5)
plt.show()

由此我们可以看出,房价和人口百分比成反比,与房间数成正比

通过梯度下降法计算回归参数,实现线性回归模型

关于梯度下降可以参看这篇文章

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
class LinearRegressionByMyself(object):
    def __init__(self, Learn_rate=0.001, epoch=20):
        self.Learning_rate = Learn_rate
        self.epoch = epoch
        
    #训练方法
    def fit(self, X, y):
        #初始化参数
        self.w = np.zeros(1+X.shape[1])
        #误差
        self.cost_list = []
        
        for i in range(self.epoch):
            #将X数据集带入回归公式
            output = self.Regression_input(X)
            error = y - output
            self.w[1:] += self.Learning_rate * X.T.dot(error)
            self.w[0] += self.Learning_rate * error.sum()
            cost = (error**2).sum() / 2.0
            self.cost_list.append(cost)
        return self
    
    def Regression_input(self, X):
        return np.dot(X, self.w[1:])+self.w[0]
    
    def predict(self, X):
        return self.Regression_input(X)

此时需要的两个参数为X,y。X为一个二维数组,y是一个一维数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X = df[['LSTAT']].values
y = df['MEDV'].values

在构造回归模型之前,先观察数据,发现数据相差比较大,这会对结果造成误差。我们用Scikie-learn里面的方法来实现归一化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.preprocessing import StandardScaler
StandardScaler_x = StandardScaler()
StandardScaler_y = StandardScaler()
X_Standard = StandardScaler_x.fit_transform(X)
y_Standard = StandardScaler_y.fit_transform(y)

训练模型,拟合数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = LinearRegressionByMyself()
model.fit(X_Standard, y_Standard)

观察误差

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.plot(range(1, model.epoch+1), model.cost_list)
plt.ylabel('SSE')
plt.xlabel('Epoch')
plt.show()
画出拟合图像
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def Regression_plot(X, y, model):
    plt.scatter(X, y, c='blue')
    plt.plot(X, model.predict(X), color='red')
    return None

Regression_plot(X_Standard, y_Standard, model)
plt.xlabel('Percentage of the population')
plt.ylabel('House price')
plt.show()
使用sklearn实现线性回归模型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.linear_model import LinearRegression
sk_model = LinearRegression()
sk_model.fit(X, y)
print('Slope: %.3f' % sk_model.coef_[0])
print('Inercept: %.3f' % sk_model.intercept_)
Regression_plot(X, y, sk_model)
plt.xlabel('Percentage of the population')
plt.ylabel('House price')
plt.show()
评估线性回归模型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.cross_validation import train_test_split
cols = ['LSTAT', 'AGE', 'DIS', 'CRIM', 'TAX', 'RM']
X = df[cols].values
y = df['MEDV'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
sk_model = LinearRegression()
sk_model.fit(X_train, y_train)
y_train_predict = sk_model.predict(X_train)
y_test_predict = sk_model.predict(X_test)
plt.scatter(y_train_predict, y_train_predict - y_train, c='red', marker='x', label='Training data')
plt.scatter(y_test_predict, y_test_predict - y_test, c='black', marker='o', label='Test data')
plt.xlabel('Predicted values')
plt.ylabel('Residuals')
plt.legend(loc='upper left')
plt.hlines(y=0, xmin=-10, xmax=50, lw=1, color='green')
plt.xlim([-10, 50])
plt.show()

预测值和训练值残差关系图

均方误差与R2评分
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.metrics import mean_squared_error
print('MSE train %.3f, test %.3f' % (
    mean_squared_error(y_train, y_train_predict),
    mean_squared_error(y_test, y_test_predict)))#MSE train 25.106, test 36.671
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.metrics import r2_score
print('R^2 train %.3f, test %.3f' % (
    r2_score(y_train, y_train_predict),
    r2_score(y_test, y_test_predict)))#R^2 train 0.706, test 0.551,

R2越接近1,效果越好

多项式回归

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X = df[['RM']].values
y = df['MEDV'].values
Regression_model = LinearRegression()
from sklearn.preprocessing import PolynomialFeatures
quadratic = PolynomialFeatures(degree=2)
cubic = PolynomialFeatures(degree=3)
X_squared = quadratic.fit_transform(X)
X_cubic = cubic.fit_transform(X)
X_fit = np.arange(X.min(), X.max(), 0.01)[: , np.newaxis]
Linear_model = Regression_model.fit(X, y)
#拟合线性
y_line_fit = Linear_model.predict(X_fit)
linear_r2 = r2_score(y, Linear_model.predict(X))
#二次模型,先二次变换再线性回归
Squared_model = Regression_model.fit(X_squared, y)
y_quad_fit = Squared_model.predict(quadratic.fit_transform(X_fit))
quadratic_r2 = r2_score(y, Squared_model.predict(X_squared))
#三次模型
Cubic_model = Regression_model.fit(X_cubic, y)
y_cubic_fit = Cubic_model.predict(cubic.fit_transform(X_fit))
cubic_r2 = r2_score(y, Cubic_model.predict(X_cubic))
#画图
plt.scatter(X, y, label='Training point', color='lightgray')
plt.plot(X_fit, y_line_fit, label='linear, $R^2=%.2f$' % linear_r2, color='blue', lw=2, linestyle=':')
plt.plot(X_fit, y_quad_fit, label='quadratic, $R^2=%.2f$' % quadratic_r2, color='red', lw=2, linestyle='-')
plt.plot(X_fit, y_cubic_fit, label='cubic, $R^2=%.2f$' % cubic_r2, color='green', lw=2, linestyle='--')
plt.xlabel('Room number')
plt.ylabel('House price')
plt.legend(loc='upper left')
plt.show()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.11.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
初试机器学习回归模型案例
初试机器学习回归模型案例 (预测房价) ——————By 李志鹏 数据集下载地址https://pan.baidu.com/s/1o8xbwIQ 探索房屋数据集 importpandasaspd df=pd.read_csv('house_data.csv') df.head() # CRIM犯罪率 RM房间数 AGE建造时长 LSTAT人口比例 MEDV平均房价 可视化房屋数据集的特征 importmatplotlib.pyplotasplt importseabornassns sns.set(cont
企鹅号小编
2018/02/27
9020
初试机器学习回归模型案例
【V课堂】机器学习系列:(二)线性回归
线性回归 本章介绍用线性模型处理回归问题。从简单问题开始,先处理一个响应变量和一个解释变量的一元问题。然后,我们介绍多元线性回归问题(multiple linear regression),线性约束由多个解释变量构成。紧接着,我们介绍多项式回归分析(polynomial regression问题),一种具有非线性关系的多元线性回归问题。最后,我们介绍如果训练模型获取目标函数最小化的参数值。在研究一个大数据集问题之前,我们先从一个小问题开始学习建立模型和学习算法。 一元线性回归 上一章我们介绍过在监督学习问题
小莹莹
2018/04/23
1.4K0
【V课堂】机器学习系列:(二)线性回归
【机器学习与实现】线性回归示例——波士顿房价分析
链接:https://pan.quark.cn/s/fc4b2415e371 提取码:ZXjU
Francek Chen
2025/01/22
1080
【机器学习与实现】线性回归示例——波士顿房价分析
机器学习 | 简单而强大的线性回归详解
回归分析是一种预测性的建模技术,它研究的是因变量和自变量之间的关系。它能够表明自多个自变量对一个因变量的影响强度。这种技术通常用于预测分析、时间序列模型以及发现变量之间的因果关系。回归分析是一种通过建立模型来研究变量之间相互关系的密切程度、结构状态及进行模型预测的有效工具,是建模和分析数据的重要工具。
数据STUDIO
2021/06/24
1.5K0
机器学习——线性回归
导入类库 1 from sklearn.externals import joblib 2 from sklearn.model_selection import train_test_split 3 from sklearn.datasets import load_boston 4 from sklearn.preprocessing import StandardScaler 5 from sklearn.linear_model import LinearRegression 6 fro
py3study
2020/01/19
4150
基于sklearn的线性回归器理论代码实现
理论 线性回归器 相比于线性分类器,线性回归器更加自然。回归任务的label是连续的变量(不像分类任务label是离散变量),线性回归器就是直接通过权值与输入对应相乘再相加直接计算出结果$$y = w^{T}*x + b$$ 其中,w为权值,x是输入,y是输出 回归器的优化 与分类器类似,回归器也是通过梯度优化的,一般来说分类问题常用均方误差函数来标定结果的质量(即代价函数)$$L(w,b) = \sum (y - y')$$ 其中y为模型输出,y'为期望值。 代码实现 数据集导入 from sklea
月见樽
2018/04/27
9120
机器学习线性回归算法
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。
润森
2022/09/22
1.4K0
机器学习线性回归算法
[scikit-learn 机器学习] 5. 多元线性回归
当改为 3 阶拟合时,多项式回归 r-squared值 0.8356924156037133 当改为 4 阶拟合时,多项式回归 r-squared值 0.8095880795746723 当改为 9 阶拟合时,多项式回归 r-squared值 -0.09435666704315328
Michael阿明
2020/07/13
1.3K0
[scikit-learn 机器学习] 5. 多元线性回归
快速入门简单线性回归 (SLR)
今天云朵君将和大家一起学习回归算法的基础知识。并取一个样本数据集,进行探索性数据分析(EDA)并使用 statsmodels.api、statsmodels.formula.api 和 scikit-learn 实现 简单线性回归(SLR)。
数据STUDIO
2022/04/11
2.6K0
快速入门简单线性回归 (SLR)
机器学习中的线性回归
线性回归是机器学习领域中最简单而有效的模型之一。它用于建立自变量(输入)和因变量(输出)之间的线性关系。在实际应用中,线性回归广泛用于预测、分析和建模。让我们深入了解线性回归的基本原理和应用。
GeekLiHua
2025/01/21
1000
线性回归算法
线性回归算法可以简单概括为,寻找一条直线,最大程度地“拟合”样本特征和样本输出标记之间的关系。
Hsinyan
2022/06/19
4970
线性回归算法
波士顿房价预测案例---多元线性回归【机器学习】
我们采用波士顿房价预测数据集进行回归任务分析。数据集分为训练集和测试集,训练集可用于训练回归模型,测试集需要进行预测。
来杯Sherry
2023/05/25
6160
python实现线性回归之简单回归
代码来源:https://github.com/eriklindernoren/ML-From-Scratch
西西嘛呦
2020/08/26
5210
python实现线性回归之简单回归
Python3入门机器学习(五)-线性回归算法
线性回归算法以一个坐标系里一个维度为结果,其他维度为特征(如二维平面坐标系中横轴为特征,纵轴为结果),无数的训练集放在坐标系中,发现他们是围绕着一条执行分布。线性回归算法的期望,就是寻找一条直线,最大程度的“拟合”样本特征和样本输出标记的关系
Meet相识
2018/09/12
1.6K0
Python3入门机器学习(五)-线性回归算法
【机器学习】在【Pycharm】中的应用:【线性回归模型】进行【房价预测】
线性回归(Linear Regression)是一种常见的统计方法和机器学习算法,用于根据一个或多个特征变量(自变量)来预测目标变量(因变量)的值。在许多实际应用中,线性回归因其简单性和有效性而被广泛使用,例如预测房价、股票市场分析、市场营销和经济学等领域。
小李很执着
2024/07/02
2731
【机器学习】在【Pycharm】中的应用:【线性回归模型】进行【房价预测】
机器学习之线性回归(最小二乘法手写+sklearn实现)
这部分内容在我的CSDN博客中已经有提到,算是比较基础的部分。现在搬到公众号上,不能再像CSDN上那样简略,我尽量把它解释得通俗易懂一点。
Cyril-KI
2022/07/29
4990
机器学习之线性回归(最小二乘法手写+sklearn实现)
写给初学者的LASSO回归
LASSO回归是对回归算法正则化的一个例子。正则化是一种方法,它通过增加额外参数来解决过拟合问题,从而减少模型的参数、限制复杂度。正则化线性回归最常用的三种方法是岭回归、最小绝对值收敛和选择算子(LASSO)以及弹性网络回归。
老齐
2020/05/15
8.8K0
写给初学者的LASSO回归
机器学习15:线性回归模型
4.1,波士顿房价预测:线性回归(无正则化项)、Ridge回归(L2正则)、LASSO回归(L1正则)、Elasitc Net算法(L1和L2正则);
用户5473628
2019/08/08
7880
算法入门(五)-- 最“直”的算法线性回归竟如此 “不正经”(附带 Kaggle 实战源码及数据集,速来围观)
大家好,欢迎来到《算法入门》系列。今天我们要聊的是机器学习中最基础、最经典的算法之一——线性回归。如果你是刚入门的朋友,不用担心,我们将用最简单、最通俗的语言带你从零开始理解它。既然是“入门”,那我们就从最基础的概念讲起。
万事可爱^
2025/01/23
900
算法入门(五)-- 最“直”的算法线性回归竟如此 “不正经”(附带 Kaggle 实战源码及数据集,速来围观)
python实现线性回归之lasso回归
Lasso回归于岭回归非常相似,它们的差别在于使用了不同的正则化项。最终都实现了约束参数从而防止过拟合的效果。但是Lasso之所以重要,还有另一个原因是:Lasso能够将一些作用比较小的特征的参数训练为0,从而获得稀疏解。也就是说用这种方法,在训练模型的过程中实现了降维(特征筛选)的目的。
西西嘛呦
2020/08/26
3.6K0
python实现线性回归之lasso回归
推荐阅读
相关推荐
初试机器学习回归模型案例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验