【机器学习(5)】Scikit-learn创建线性回归模型(LinearRegression、Lasso及Ridge)和逻辑回归模型(logistic)

本文主要是介绍【机器学习(5)】Scikit-learn创建线性回归模型(LinearRegression、Lasso及Ridge)和逻辑回归模型(logistic),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 数据加载

假如进行房价的预测,这里加载的数据共1000条,共十个维度(十个特征),除了id以外,其余的都是自变量(9个可用)

import pandas as pd
import numpy as np 
import os
import matplotlib.pyplot as plt
os.chdir(r"C:\Users\86177\Desktop")df = pd.read_csv('sample_data_sets.csv')
print(df.columns)
print(df.shape)

–> 输出的结果为:

Index(['id', 'complete_year', 'average_price', 'area', 'daypop', 'nightpop','night20-39', 'sub_kde', 'bus_kde', 'kind_kde'],dtype='object')(1000, 10)

自变量参数讲解:complete_year房子建造年代、average_price平均价格、area房间面积、daypop白天人口密度、nightpop夜间人口密度、night20-3920-39岁夜间人口密度、sub_kde地铁服务水平、bus_kde公交车服务水平、kind_kde幼儿园服务水平

2. 提取自变量和制作因变量标签

1) 通过上述列举的9个自变量参数,可以发现前两个对于其他参数来说重要性程度偏低,可以选择后面7个参数作为自变量

2) 因变量标签这里,采用平均价格的中位数进行标定,如果超过这个中位数,就定位高房价,低于这个中位数,就是低房价

代码实现如下:(为了保护数据的完整性和防止数据被破坏,这里先制作标签,然后再将数据进行复制,最后操作的是数据副本)

price_median = df['average_price'].median()
print(price_median)
df['is_high'] = df['average_price'].map(lambda x: True if x>= price_median else False)
print(df['is_high'].value_counts()) 

–> 输出的结果为:(先取平均价格的中位数,再创建一个因变量标签)

30519.0
True     500
False    500
Name: is_high, dtype: int64

数据复制并提取自变量和因变量(注意,线性回归使用的都是y_train数值型标签,后面的逻辑回归使用的是y_label类别型标签)

# 提取自变量:数值型
x_train = df.copy()[['area', 'daypop', 'nightpop', 'night20-39', 'sub_kde', 'bus_kde', 'kind_kde']]
# 提取因变量:数值型
y_train = df.copy()['average_price']
# 提取因变量:类别型
y_label = df.copy()['is_high']

3. 创建Pipeline对象和构建线性模型

为了熟悉并掌握创建模型的工作流(数据预处理,标准化,纠偏等过程),这里将整个流程封装在Pipeline的对象中,该对象中需要引入一个list列表,也就是所有步骤的汇总所在地,基本步骤包含两个要素: 步骤的命名模型对象(里面是有参数的)

3.1 加载模块、构造模型并拟合

这里传入的参数是fit_intercept=True,要求模型去拟合截距值,也就是b值,如果是False,返回的结果也就没有b值,(因为只有一个线性模型,Pipeline里面就只有一个数据)

# 加载pipeline
from sklearn.pipeline import Pipeline
# 加载线性回归模型
from sklearn.linear_model import LinearRegression
# 构建线性回归模型
pipe_lm = Pipeline([('lm_regr',LinearRegression(fit_intercept=True))])
# 训练线性回归模型
pipe_lm.fit(x_train, y_train)
# 使用线性回归模型进行预测
y_train_predict = pipe_lm.predict(x_train)
3.2 查看线性模型特征参数和截距值

.coef_ / .intercept_ 分别代表特征参数(coefficient)和截距值(intercept)

# 查看线性回归模型特征参数
print(pipe_lm.named_steps['lm_regr'].coef_)
# 查看线性回归模型截距值
print(pipe_lm.named_steps['lm_regr'].intercept_)

–> 输出的结果为:(输出的是7个参数一个b值)

[ 9.68026492e+00  3.45789754e+00 -1.68662269e+01  4.34410864e+015.92819921e+04  3.41972844e+03  9.69441685e+03]24662.078913322737
3.3 提取模型特征参数及对应的名称

提取完相应的数据之后,将其创建为DataFrame数据

# 提取模型特征参数
coef = pipe_lm.named_steps['lm_regr'].coef_
# 提取对应的特征名称
features = x_train.columns.tolist()
# 构建参数df
coef_table = pd.DataFrame({'feature': features, 'coefficient': coef})
print(coef_table)

–> 输出的结果为:(这里的特征名称,其实就是当初索引的几个列标题)

     feature   coefficient
0        area      9.971842
1      daypop      3.720621
2    nightpop    -17.122363
3  night20-39     43.528716
4     sub_kde  59019.531359
5     bus_kde   3309.771544
6    kind_kde   9410.012382
3.4 绘制参数柱状图

matplotlib库前面已经导入过了,这里可以直接使用,这一步主要是看一下7个参数的影响水平如何

# 绘制参数特征值柱状图
coef_table.set_index(['feature']).plot.barh()
# 设置x等于0的参考线
plt.axvline(0, color='k')
# 显示图表
plt.show()

–> 输出的结果为:
在这里插入图片描述
由上图可知,最后三个(在最上面的数据是排在最后的)服务水平的特征值远远大于前四个参数的,要查看前四个的相关数据,可以单独绘制图像,如下

# 绘制参数特征值柱状图
coef_table.set_index(['feature']).iloc[0:4].plot.barh()
# 设置x等于0的参考线
plt.axvline(0, color='k')
# 显示图表
plt.show()

–> 输出的结果为:
在这里插入图片描述

4 构建Lasso回归模型

前面讲了有关Pipeline对象的知识,直接就可以直接加载框架了,构建Lasso回归模型

4.1 加载模块、构造模型并拟合

这一步几乎和上面创建线性模型类似,不同的就是在于Pipeline对象列表中的内容发生了变化,参数添加了一个alpha,其大小就是控制L1正则系数的影响力,其值越大,L1正则系数对模型的约束也就越大(回顾上一篇的讲解)

# 加载lasso回归模型
from sklearn.linear_model import Lasso
# 构建线性回归模型
pipe_lasso = Pipeline([('lasso_regr',Lasso(alpha=500, fit_intercept=True))])
# 训练线性回归模型
pipe_lasso.fit(x_train, y_train)
# 使用线性回归模型进行预测
y_train_predict = pipe_lasso.predict(x_train)
4.2 查看线性模型特征参数和截距值
# 查看线性回归模型特征参数
print(pipe_lasso.named_steps['lasso_regr'].coef_)
# 查看线性回归模型截距值
print(pipe_lasso.named_steps['lasso_regr'].intercept_)

–> 输出的结果为:(可以看出其中的几个参数已经为0了,)

[ 27.03261599   6.97427277 -14.89931364  33.19206407   0.0.           0.        ]
26065.635086213653

上述的结果也就对应了上篇文章中提到的有关L1正则系数相关的知识点,如下
在这里插入图片描述

4.3 提取模型特征参数及对应的名称
coef = pipe_lasso.named_steps['lasso_regr'].coef_
# 提取对应的特征名称
features = x_train.columns.tolist()
# 构建参数df
coef_table = pd.DataFrame({'feature': features, 'coefficient': coef})
print(coef_table)

–> 输出的结果为:(被筛除的特征特征参数为0

      feature  coefficient
0        area    27.032616
1      daypop     6.974273
2    nightpop   -14.899314
3  night20-39    33.192064
4     sub_kde     0.000000
5     bus_kde     0.000000
6    kind_kde     0.000000
4.4 绘制参数柱状图
coef_table.set_index(['feature']).plot.barh()
# 设置x等于0的参考线
plt.axvline(0, color='k')
# 显示图表
plt.show()

–> 输出的结果为:
在这里插入图片描述

5 构建Ridge回归模型

废话不多说,直接开搞

5.1 加载模块、构造模型并拟合

与上面不同的是,这里又加了一个参数solver,也就是模型求解器,采用的方式为'lsqr'(最小二乘正交分解法)

from sklearn.linear_model import Ridge
# 构建ridge回归模型
pipe_ridge = Pipeline([('ridge_regr',Ridge(alpha=500, fit_intercept=True, solver = 'lsqr'))])
# 训练ridge回归模型
pipe_ridge.fit(x_train, y_train)
# 使用ridge回归模型进行预测
y_train_predict = pipe_ridge.predict(x_train)
5.2 查看线性模型特征参数和截距值
# 查看ridge回归模型特征参数
print(pipe_ridge.named_steps['ridge_regr'].coef_)
# 查看ridge回归模型截距值
print(pipe_ridge.named_steps['ridge_regr'].intercept_)

–> 输出的结果为:(与Lasso的区别可以发现,特征参数被约束接近于0,但不为0,b值差不多)

[ 27.12349221   7.01529213 -15.17165526  33.87360557   0.273439210.16398909   0.67896087]26056.944107140367
5.3 提取模型特征参数及对应的名称
# 提取模型特征参数
coef = pipe_ridge.named_steps['ridge_regr'].coef_
# 提取对应的特征名称
features = x_train.columns.tolist()
# 构建参数df
coef_table = pd.DataFrame({'feature': features, 'coefficient': coef})
print(coef_table)

–> 输出的结果为:

      feature  coefficient
0        area    27.123492
1      daypop     7.015292
2    nightpop   -15.171655
3  night20-39    33.873606
4     sub_kde     0.273439
5     bus_kde     0.163989
6    kind_kde     0.678961
5.4 绘制参数柱状图
coef_table.set_index(['feature']).plot.barh()
# 设置x等于0的参考线
plt.axvline(0, color='k')
# 显示图表
plt.show()

–> 输出的结果为:
在这里插入图片描述

6. 构建logisti回归模型

6.1 加载模块、构造模型并拟合

还是一样加载Pipeline对象,将模型封装在里面,不同的是增加了参数penalty='l1',就是之前提到的L1正则系数,这次的求解器选择了'liblinear',也就是坐标下降法;(少数据量中选择坐标下降法, 大数据量下选择‘sag’或者'saga'

由于这里是分类的问题,最后训练的标签应该是类别型(y_label),而不再是之前的数值型(y_train)

# 加载logsti回归模型
from sklearn.linear_model import LogisticRegression
# 构建线性回归模型
pipe_logistic = Pipeline([('logistic_clf',LogisticRegression(penalty='l1', fit_intercept=True, solver='liblinear'))])
# 训练线性回归模型
pipe_logistic.fit(x_train, y_label)
# 使用线性回归模型进行预测
y_train_predict = pipe_logistic.predict(x_train)

逻辑回归模型参数解释 v0.21.3(2020/3/1) penalty(默认使用l2正则系数)

‘l1’: l1正则系数
‘l2’: l2正则系数
‘elasticnet’正则系数:只支持solver为’saga’
‘none’:无正则系数
solver(默认是’liblinear’:坐标下降法) ‘liblinear’:坐标下降法,可以处理了l1和l2正则系数,适用于小数据量(一般指10w个样本以下) ‘sag’:sag是随机平均梯度下降法,只能处理l2正则系数,适用于大数据量 ‘saga’: saga是sag的变体,能处理l1和l2正则系数,适用于大数据量

具体的一些讲解可以查询官网

6.2 查看线性模型特征参数和截距值
# 查看逻辑回归模型特征参数
print(pipe_logistic.named_steps['logistic_clf'].coef_)
# 查看逻辑回归模型截距值
print(pipe_logistic.named_steps['logistic_clf'].intercept_)

–> 输出的结果为:

[[-2.54246544e-03  8.50783993e-04 -4.65784667e-03  1.16522529e-029.62287062e+00  1.89063148e-01  1.41218313e+00]][-0.22713829]
5.3 提取模型特征参数及对应的名称
# 提取模型特征参数
coef = pipe_logistic.named_steps['logistic_clf'].coef_[0]
# 提取对应的特征名称
features = x_train.columns.tolist()
# 构建参数df
coef_table = pd.DataFrame({'feature': features, 'coefficient': coef})
print(coef_table)

–> 输出的结果为:(注意这里的coef变量,之前生成的列表都是一维的,这里是一维的,所以要索引第一个元素)

      feature  coefficient
0        area    -0.002542
1      daypop     0.000851
2    nightpop    -0.004658
3  night20-39     0.011652
4     sub_kde     9.622871
5     bus_kde     0.189063
6    kind_kde     1.412183
5.4 绘制参数柱状图
coef_table.set_index(['feature']).plot.barh()
# 设置x等于0的参考线
plt.axvline(0, color='k')
# 显示图表
plt.show()

–> 输出的结果为:
在这里插入图片描述

这篇关于【机器学习(5)】Scikit-learn创建线性回归模型(LinearRegression、Lasso及Ridge)和逻辑回归模型(logistic)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483702

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss