[scikit-learn 机器学习] 5. 多元线性回归

文章目录

    • 1. 多元线性回归
    • 2. 多项式回归
    • 3. 正则化
    • 4. 线性回归应用举例(酒质量预测)
      • 4.1 数据预览
      • 4.2 模型验证
    • 5. 梯度下降法

本文为 scikit-learn机器学习(第2版)学习笔记

1. 多元线性回归

模型 y=α+β1x1+β2x2+...+βnxny = \alpha+\beta_1x_1+\beta_2x_2+...+\beta_nx_ny=α+β1x1+β2x2+...+βnxn

写成向量形式:Y=Xβ→β=(XTX)−1XTYY=X\beta \rightarrow \beta=(X^TX)^{-1}X^TYY=Xββ=(XTX)1XTY

还是披萨价格预测的背景:

  • 特征:披萨直径、配料数量,预测目标:披萨价格
  • 参数包含:一个截距项、两个特征的系数
from numpy.linalg import inv
from numpy import dot, transpose
X = [[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0]]
y = [[7], [9], [13], [17.5], [18]]
print(dot(inv(dot(transpose(X),X)), dot(transpose(X),y)))from numpy.linalg import lstsq
# help(lstsq)
print(lstsq(X,y))
[[1.1875    ][1.01041667][0.39583333]](array([[1.1875    ],[1.01041667],[0.39583333]]), array([8.22916667]), 3, array([26.97402951,  2.46027806,  0.59056212]))系数, 			残差,     			秩, 奇异值
  • sklearn 线性回归
from sklearn.linear_model import LinearRegression
X = [[6, 2], [8, 1], [10, 0], [14, 2], [18, 0]]
y = [[7], [9], [13], [17.5], [18]]model = LinearRegression()
model.fit(X, y)X_test = [[8, 2], [9, 0], [11, 2], [16, 2], [12, 0]]
y_test = [[11], [8.5], [15], [18], [11]]
predictions = model.predict(X_test)for i, pred in enumerate(predictions):print("预测值:%s, 实际值:%s" %(pred, y_test[i]))
print(model.score(X_test,y_test))
预测值:[10.0625], 实际值:[11]
预测值:[10.28125], 实际值:[8.5]
预测值:[13.09375], 实际值:[15]
预测值:[18.14583333], 实际值:[18]
预测值:[13.3125], 实际值:[11]
0.7701677731318468 # r_squared

2. 多项式回归

披萨的价格跟直径之间可能不是线性的关系

二阶多项式模型:y=α+β1x+β2x2y = \alpha+\beta_1x+\beta_2x^2y=α+β1x+β2x2

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeaturesX_train = [[6], [8], [10], [14], [18]] # 直径
y_train = [[7], [9], [13], [17.5], [18]]
X_test = [[6], [8], [11], [16]] # 价格
y_test = [[8], [12], [15], [18]]
regressor = LinearRegression()
regressor.fit(X_train, y_train)
xx = np.linspace(0, 26, 100)
yy = regressor.predict(xx.reshape(xx.shape[0], 1))
plt.plot(xx, yy, c='g',linestyle='-')# 2次项特征转换器
quadratic_featurizer = PolynomialFeatures(degree=2)
X_train_quadratic = quadratic_featurizer.fit_transform(X_train)
X_test_quadratic = quadratic_featurizer.transform(X_test)
print("原特征\n",X_train)
print("二次项特征\n",X_train_quadratic)regressor_quadratic = LinearRegression()
regressor_quadratic.fit(X_train_quadratic, y_train)
xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), c='r', linestyle='--')
plt.rcParams['font.sans-serif'] = 'SimHei'  # 消除中文乱码
plt.title('披萨价格 VS 直径')
plt.xlabel('直径')
plt.ylabel('价格')
plt.axis([0, 25, 0, 25])
plt.grid(True)
plt.scatter(X_train, y_train)
plt.show()print('简单线性回归 r-squared值', regressor.score(X_test, y_test))
print('二次多项式回归 r-squared值', regressor_quadratic.score(X_test_quadratic, y_test))

在这里插入图片描述

原特征[[6], [8], [10], [14], [18]]
二次项特征[[  1.   6.  36.][  1.   8.  64.][  1.  10. 100.][  1.  14. 196.][  1.  18. 324.]]简单线性回归 r-squared值 0.809726797707665
二次多项式回归 r-squared值 0.8675443656345054 # 决定系数更大

当改为 3 阶拟合时,多项式回归 r-squared值 0.8356924156037133
当改为 4 阶拟合时,多项式回归 r-squared值 0.8095880795746723
当改为 9 阶拟合时,多项式回归 r-squared值 -0.09435666704315328

为9阶时,模型完全拟合了训练数据,却不能够很好地对 test 集做出好的预测,称之过拟合

3. 正则化

正则化,预防过拟合

在这里插入图片描述
L1 正则可以实现特征的稀疏(趋于产生少量特征,其他为0)
L2 正则可以防止过拟合,提升模型的泛化能力(选择更多的特征,特征更一致的向0收缩,但不为0)

4. 线性回归应用举例(酒质量预测)

酒的质量预测(0-10的离散值,本例子假定是连续的,做回归预测)
特征:11种物理化学性质

4.1 数据预览

# 酒质量预测
import pandas as pd
data = pd.read_csv("winequality-red.csv",sep=';')
data.describe()

在这里插入图片描述

在这里插入图片描述
相关系数矩阵显示,酒的质量 跟 酒精含量 呈较强的正相关,跟 柠檬酸 呈较强的负相关

4.2 模型验证

from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_splitX = data[list(data.columns)[:-1]]
y = data['quality']
X_train,X_test,y_train,y_test = train_test_split(X,y)regressor = LinearRegression()
regressor.fit(X_train,y_train)
y_pred = regressor.predict(X_test)
print("决定系数:", regressor.score(X_test,y_test))
# 决定系数: 0.3602241149540347
  • 5 折交叉验证
from sklearn.model_selection import cross_val_score
scores = cross_val_score(regressor, X, y, cv=5)
scores.mean() # 0.2900416288421962
scores # array([0.13200871, 0.31858135, 0.34955348, 0.369145  , 0.2809196 ])

5. 梯度下降法

一种有效估计 模型最佳参数 的方法

朝着代价函数下降最快的梯度迈出步伐(步长,也叫学习率)

  • 学习率太小,收敛时间边长
  • 学习率太大,会在局部极小值附近震荡,不收敛

根据每次训练迭代,使用的训练实例数量:

  • 批次梯度下降:每次训练,使用全部实例来更新模型参数,时间长,结果确定
  • 随机梯度下降:每次训练,随机选取一个实例,时间短,每次结果不确定,接近极小值

sklearn 的 SGDRegressor 是随机梯度下降的一种实现

import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import SGDRegressor
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_splitdata = load_boston()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target)X_scaler = StandardScaler()
y_scaler = StandardScaler()
X_train = X_scaler.fit_transform(X_train)
y_train = y_scaler.fit_transform(y_train.reshape(-1, 1))
X_test = X_scaler.transform(X_test)
y_test = y_scaler.transform(y_test.reshape(-1, 1))regressor = SGDRegressor(loss='squared_loss')
scores = cross_val_score(regressor, X_train, y_train, cv=5)print('Cross validation r-squared scores: %s' % scores)
print('Average cross validation r-squared score: %s' % np.mean(scores))regressor.fit(X_train, y_train)
print('Test set r-squared score %s' % regressor.score(X_test, y_test))
Cross validation r-squared scores: [0.57365322 0.73833251 0.69391029 0.67979254 0.73491949]
Average cross validation r-squared score: 0.6841216111623614
Test set r-squared score 0.7716363798764403

help(SGDRegressor)

class SGDRegressor(BaseSGDRegressor)|  SGDRegressor(loss='squared_loss', penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=1000, tol=0.001, shuffle=True, verbose=0, epsilon=0.1, random_state=None,learning_rate='invscaling', eta0=0.01, power_t=0.25, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, warm_start=False, average=False)|  |  Linear model fitted by minimizing a regularized empirical loss with SGD|  |  SGD stands for Stochastic Gradient Descent: the gradient of the loss is|  estimated each sample at a time and the model is updated along the way with|  a decreasing strength schedule (aka learning rate).|  |  The regularizer is a penalty added to the loss function that shrinks model|  parameters towards the zero vector using either the squared euclidean norm|  L2 or the absolute norm L1 or a combination of both (Elastic Net). If the|  parameter update crosses the 0.0 value because of the regularizer, the|  update is truncated to 0.0 to allow for learning sparse models and achieve|  online feature selection.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac笔记本修改 mysql 的密码

第一种 mysql版本:5.7.17 1.首先我们要关闭mysql服务 sudo /usr/local/mysql/support-files/mysql.server stop 2.我们要用安全模式启动mysql sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables 3.使用root账号登录mysql服务 /usr/local/mysql/bin/mysql …

LeetCode 831. 隐藏个人信息

1. 题目 给你一条个人信息字符串 S,它可能是一个 邮箱地址 ,也可能是一串 电话号码 。 我们将隐藏它的隐私信息,通过如下规则: 电子邮箱 定义名称 name 是长度大于等于 2 (length ≥ 2),并且只包含小写…

oa项目经验描述_简历中项目经验模版

项目名称:OA(办公自动化)开发工具:MyEclipse 8.6 , Oracle 11g , Tomcat 6.0.18项目描述(1, SSH框架版):OA主要功能模块分为首页Portlet展示、协同审批、协同工作、日历、资源管理、知识中心、新闻中心、通讯录、系统管理。是一套很好的办公自…

分离

web2.0到处都是分离与聚合的思想: jquery实现了表现层的行为与内容的分离 zendframework为首的mvc架构实现了逻辑架构的控制、模块、表现层的分离 mysql为例的master-slave架构实现了服务与备份的分离 hadoop为首的虚拟化架构实现了单点计算与群体计算的结合 css实现…

hive-内置函数(常用内置函数汇总)

show functions; #查看所有内置函数,共271个 show function sum; #查看sum函数的描述信息 show function extended sum; #查看内置函数的描述信息和举例的使用方法 举例数据表:stu id name address score credit 01 huang hebi,changzhou,dalian …

LeetCode 828. 统计子串中的唯一字符(中心扩展)

1. 题目 我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符,并返回唯一字符的个数。 例如:s “LEETCODE” ,则其中 “L”, “T”,“C”,“O”,“D” 都是唯一字符,因为它们只出现一次,所以 coun…

钢笔的保养

钢笔其实很泼辣的不需要用心的保养,但如果太不注意了,也会早早损毁了一支好笔。所以,为了自己方便地更长久些,还是要保养一下。保养的方法很简单,就是: 用前先浸,墨水不混,定期清洗。…

hive - 自定义函数(超详细步骤,手把手的交)

用Java开发自定义函数,步骤: 1.eclipse上新建一个工程project(db2019); 2.导jar依赖包: db2019右键 --build path --configure... --add library --user library --new(新建一个library(hive2.3.2_jar)) --add ext…

LeetCode 1053. 交换一次的先前排列

1. 题目 给你一个正整数的数组 A(其中的元素不一定完全不同),请你返回可在 一次交换(交换两数字 A[i] 和 A[j] 的位置)后得到的、按字典序排列小于 A 的 最大可能排列。 如果无法这么操作,就请返回原数组…

bootstrap 树形表格渲染慢_layUI之树状表格异步加载组件treetableAsync.js(基于treetable.js)...

概述后台框架中使用树状表格是非常常用的操作,layUI本身并没有这种组件。 第三方的treetable.js做到了完美的实现,但是不能实现在双击时异步加载数据,本文就是站在了巨人的肩膀上实现的异步加载的树状表格~1. 使用说明本组件基于treetable.js…

EchoServer

using System;using System.Net.Sockets;using System.IO;using System.Net; namespace ConsoleApplication1{ class EchoServer { public static void Main11() { // TcpListener监听端口1234 IPAddress ipAd IPAddress.Parse(&qu…

hive - 解析 json

内置函数:get_json_object(json串,解析路径) 解析路径说明: $ :跟对象 . :子对象 [] :数组下标 * :所有 举例: 数据样例: {"movie":"1190","rate":"4.8","timestamp":…

[scikit-learn 机器学习] 6. 逻辑回归

文章目录1. 逻辑回归二分类2. 垃圾邮件过滤2.1 性能指标2.2 准确率2.3 精准率、召回率2.4 F1值2.5 ROC、AUC3. 网格搜索调参4. 多类别分类5. 多标签分类5.1 多标签分类性能指标本文为 scikit-learn机器学习(第2版)学习笔记逻辑回归常用于分类任务 1. 逻…

libsvm回归参数寻优cgp_【lightgbm/xgboost/nn代码整理二】xgboost做二分类,多分类以及回归任务...

1.简介该部分是代码整理的第二部分,为了方便一些初学者调试代码,作者已将该部分代码打包成一个工程文件,包含简单的数据处理、xgboost配置、五折交叉训练和模型特征重要性打印四个部分。数据处理部分参考:代码整理一,这…

hive - 可优化的 10 个地方及详解

1.合理选择排序 排序算法比较耗资源,应根据业务需要选择 order by :全局排序,大数据集会消耗太过漫长的时间sort by:局部排序,只能保证每个reducer的输出数据都是有序的distribute by:分桶不排序,控制map…

[scikit-learn 机器学习] 7. 朴素贝叶斯

文章目录1. 朴素贝叶斯2. NB 与 逻辑回归对比本文为 scikit-learn机器学习(第2版)学习笔记相关知识参考:《统计学习方法》朴素贝叶斯法(Naive Bayes,NB) 1. 朴素贝叶斯 通过最大概率来预测类&#xff1a…

堕落的时候看看——清华大学老师的一席话

一双鞋,耐克的6百多;李宁的4百多;特步的3百多;361的2百多;所以,你毕业于一个什么样的大学很重要。 一双鞋,在地摊不过几十元,到了商场、专卖店,会涨到一百甚至几百。所以…

塔菲克蓝牙适配器驱动_小身材,大功能,biaze毕亚兹USB蓝牙适配器开箱体验

在日常生活中,我们平时使用的台式电脑或是笔记本电脑,想要传输数据或者音频的时候,都是需要借助数据传输线或是U盘等传输设备,使用过程可想而知,有点麻烦。我们都知道,手机是有蓝牙传输功能的,只…

MySQL - cast()函数

日常建表习惯用 create tabel tb_name as select......,这种建表方式的其中一个缺点就是:系统会根据查询出的字段,定义字段类型。有时候会把 %Y-%m-%d 格式的日期字段定义为 varchar 。建模的时候苦不堪言。 那么怎么在建表过程中自己定义每…

HDU1003——MAX SUM

简单DP&#xff0c;状态转移公式&#xff1a;num[j].data max{num[j].data, num[j].datanum[j-1].data}&#xff0c;也就是保证加上前一个数不失自己的值减小。 View Code #include <stdio.h>#define N 100010#define inf 9999999struct _num{int data;int pre;int nex…