5_普通最小二乘法线性回归案例(Scikit-learn 0.18.2)

news2024/11/19 13:33:19
  • 现有一批描述家庭用电情况的数据,对数据进行算法模型预测,并最终得到预测模型(每天各个时间段和功率之间的关系、功率与电流之间的关系等)

    • 数据来源:Individual household electric power consumption Data Set
    • 建议:使用python的sklearn库的linear model中LinearRegression来获取算法
    • 开发环境:https://scikit-learn.org/0.18/
# 引入所需要的全部包
from sklearn.model_selection import train_test_split # 数据划分的类
from sklearn.linear_model import LinearRegression # 线性回归的类
from sklearn.preprocessing import StandardScaler # 数据标准化

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
from pandas import DataFrame
import time
## 设置字符集,防止中文乱码
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
# 加载数据
# 日期、时间、有功功率、无功功率、电压、电流、厨房用电功率、洗衣服用电功率、热水器用电功率
path1='datas/household_power_consumption_1000.txt'
df = pd.read_csv(path1, sep=';', low_memory=False)#没有混合类型的时候可以通过low_memory=F调用更多内存,加快效率)
df.head() ## 获取前五行数据查看查看
DateTimeGlobal_active_powerGlobal_reactive_powerVoltageGlobal_intensitySub_metering_1Sub_metering_2Sub_metering_3
016/12/200617:24:004.2160.418234.8418.40.01.017.0
116/12/200617:25:005.3600.436233.6323.00.01.016.0
216/12/200617:26:005.3740.498233.2923.00.02.017.0
316/12/200617:27:005.3880.502233.7423.00.01.017.0
416/12/200617:28:003.6660.528235.6815.80.01.017.0
# 查看格式信息
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 9 columns):
Date                     1000 non-null object
Time                     1000 non-null object
Global_active_power      1000 non-null float64
Global_reactive_power    1000 non-null float64
Voltage                  1000 non-null float64
Global_intensity         1000 non-null float64
Sub_metering_1           1000 non-null float64
Sub_metering_2           1000 non-null float64
Sub_metering_3           1000 non-null float64
dtypes: float64(7), object(2)
memory usage: 70.4+ KB
# 异常数据处理(异常数据过滤)
new_df = df.replace('?', np.nan)#替换非法字符为np.nan
datas = new_df.dropna(axis=0, how = 'any') # 只要有一个数据为空,就进行行删除操作
datas.describe().T#观察数据的多种统计指标(只能看数值型的)
countmeanstdmin25%50%75%max
Global_active_power1000.02.4187721.2399790.2061.8062.4143.3087.706
Global_reactive_power1000.00.0892320.0880880.0000.0000.0720.1260.528
Voltage1000.0240.0357904.084420230.980236.940240.650243.295249.370
Global_intensity1000.010.3510005.1222140.8008.40010.00014.00033.200
Sub_metering_11000.00.0000000.0000000.0000.0000.0000.0000.000
Sub_metering_21000.02.7490008.1040530.0000.0000.0001.00038.000
Sub_metering_31000.05.7560008.0669410.0000.0000.00017.00019.000
# 查看格式信息
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 9 columns):
Date                     1000 non-null object
Time                     1000 non-null object
Global_active_power      1000 non-null float64
Global_reactive_power    1000 non-null float64
Voltage                  1000 non-null float64
Global_intensity         1000 non-null float64
Sub_metering_1           1000 non-null float64
Sub_metering_2           1000 non-null float64
Sub_metering_3           1000 non-null float64
dtypes: float64(7), object(2)
memory usage: 70.4+ KB
## 创建一个时间函数格式化字符串
def date_format(dt):
    # dt显示是一个series/tuple;dt[0]是date,dt[1]是time
    import time
    t = time.strptime(' '.join(dt), '%d/%m/%Y %H:%M:%S')
    return (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)
## 需求:构建时间和功率之间的映射关系,可以认为:特征属性为时间;目标属性为功率值。
# 获取x和y变量, 并将时间转换为数值型连续变量
X = datas.iloc[:,0:2]
X = X.apply(lambda x: pd.Series(date_format(x)), axis=1)
Y = datas['Global_active_power']
X.head(2)
012345
02006121617240
12006121617250
## 对数据集进行测试集合训练集划分
# X:特征矩阵(类型一般是DataFrame)
# Y:特征对应的Label标签(类型一般是Series)
# test_size: 对X/Y进行划分的时候,测试集合的数据占比, 是一个(0,1)之间的float类型的值
# random_state: 数据分割是基于随机器进行分割的,该参数给定随机数种子;给一个值(int类型)的作用就是保证每次分割所产生的数数据集是完全相同的
X_train,X_test,Y_train,Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
print(X_train.shape)
print(X_test.shape)
print(Y_train.shape)
(800, 6)
(200, 6)
(800,)
# 查看训练集上的数据信息(X)
X_train.describe()
## 数据标准化
# StandardScaler:将数据转换为标准差为1的数据集(有一个数据的映射)
# scikit-learn中:如果一个API名字有fit,那么就有模型训练的含义,没法返回值
# scikit-learn中:如果一个API名字中有transform, 那么就表示对数据具有转换的含义操作
# scikit-learn中:如果一个API名字中有predict,那么就表示进行数据预测,会有一个预测结果输出
# scikit-learn中:如果一个API名字中既有fit又有transform的情况下,那就是两者的结合(先做fit,再做transform)
ss = StandardScaler() # 模型对象创建
X_train = ss.fit_transform(X_train) # 训练模型并转换训练集
X_test = ss.transform(X_test) ## 直接使用在模型构建数据上进行一个数据标准化操作 (测试集)
pd.DataFrame(X_train).describe()
012345
count800.0800.08.000000e+028.000000e+028.000000e+02800.0
mean0.00.02.445821e-15-8.604228e-178.104628e-170.0
std0.00.01.000626e+001.000626e+001.000626e+000.0
min0.00.0-1.221561e+00-1.333814e+00-1.722545e+000.0
25%0.00.0-1.221561e+00-8.377420e-01-8.532677e-010.0
50%0.00.08.186245e-01-3.416698e-011.600918e-020.0
75%0.00.08.186245e-011.022529e+008.852861e-010.0
max0.00.08.186245e-011.518601e+001.696611e+000.0
## 模型训练
lr = LinearRegression(fit_intercept=True) # 模型对象构建
lr.fit(X_train, Y_train) ## 训练模型
## 模型校验
y_predict = lr.predict(X_test) ## 预测结果

print("训练集上R2:",lr.score(X_train, Y_train))
print("测试集上R2:",lr.score(X_test, Y_test))
mse = np.average((y_predict-Y_test)**2)
rmse = np.sqrt(mse)
print("rmse:",rmse)
训练集上R2: 0.24409311805909026
测试集上R2: 0.12551628513735869
rmse: 1.1640923459736248
# 输出模型训练得到的相关参数
print("模型的系数(θ):", end="")
print(lr.coef_)
print("模型的截距:", end='')
print(lr.intercept_)
模型的系数(θ):[ 0.00000000e+00 -6.66133815e-16 -1.41588166e+00 -9.34953243e-01
 -1.02140756e-01  0.00000000e+00]
模型的截距:2.4454375000000033
## 模型保存/持久化
# 在机器学习部署的时候,实际上其中一种方式就是将模型进行输出;另外一种方式就是直接将预测结果输出
# 模型输出一般是将模型输出到磁盘文件
from sklearn.externals import joblib

# 保存模型要求给定的文件所在的文件夹必须存在
joblib.dump(ss, "result/data_ss.model") ## 将标准化模型保存
joblib.dump(lr, "result/data_lr.model") ## 将模型保存
# 加载模型
ss3 = joblib.load("result/data_ss.model") ## 加载模型
lr3 = joblib.load("result/data_lr.model") ## 加载模型

# 使用加载的模型进行预测
data1 = [[2006, 12, 17, 12, 25, 0]]
data1 = ss3.transform(data1)
print(data1)
lr3.predict(data1)
[[ 0.          0.          0.81862454  0.15440249 -0.27374978  0.        ]]



array([1.16996393])
## 预测值和实际值画图比较
t=np.arange(len(X_test))
plt.figure(facecolor='w')#建一个画布,facecolor是背景色
plt.plot(t, Y_test, 'r-', linewidth=2, label='真实值')
plt.plot(t, y_predict, 'g-', linewidth=2, label='预测值')
plt.legend(loc = 'upper left')#显示图例,设置图例的位置
plt.title("线性回归预测时间和功率之间的关系", fontsize=20)
plt.grid(b=True)#加网格
plt.show()

在这里插入图片描述

## 功率和电流之间的关系
X = datas.iloc[:,2:4]
Y2 = datas.iloc[:,5]

## 数据分割
X2_train,X2_test,Y2_train,Y2_test = train_test_split(X, Y2, test_size=0.2, random_state=0)

## 数据归一化
scaler2 = StandardScaler()
X2_train = scaler2.fit_transform(X2_train) # 训练并转换
X2_test = scaler2.transform(X2_test) ## 直接使用在模型构建数据上进行一个数据标准化操作 

## 模型训练
lr2 = LinearRegression()
lr2.fit(X2_train, Y2_train) ## 训练模型

## 结果预测
Y2_predict = lr2.predict(X2_test)

## 模型评估
print("电流预测准确率: ", lr2.score(X2_test,Y2_test))
print("电流参数:", lr2.coef_)

## 绘制图表
#### 电流关系
t=np.arange(len(X2_test))
plt.figure(facecolor='w')
plt.plot(t, Y2_test, 'r-', linewidth=2, label=u'真实值')
plt.plot(t, Y2_predict, 'g-', linewidth=2, label=u'预测值')
plt.legend(loc = 'lower right')
plt.title(u"线性回归预测功率与电流之间的关系", fontsize=20)
plt.grid(b=True)
plt.show()
电流预测准确率:  0.9920420609708968
电流参数: [5.07744316 0.07191391]

在这里插入图片描述

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

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

相关文章

Meta开源音乐生成AI模型MusicGen;直白图解GPT2模型Self Attention注意力机制

&#x1f989; AI新闻 &#x1f680; Meta开源音乐生成AI模型MusicGen 摘要&#xff1a;Meta在Github上开源了其AI语言模型MusicGen&#xff0c;该模型基于Google 2017年推出的Transformer模型&#xff0c;可将文本和旋律转化为完整乐曲。MusicGen支持文本与旋律的组合输入&a…

Python实现ACO蚁群优化算法优化XGBoost回归模型(XGBRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

AD板子定位孔打孔的两种方式

第一种 注意 直径大小要和 开孔直径一样。 Plated 这个勾打掉 去掉金属壁. 还要X Y坐标 添加一样。 孔位对齐 第二种 选中要开孔的圆 切到机械1层 快捷键 T V B 看效果 总结&#xff1a;第二种最简单

SpringBoot源码-自动装配

一、自动装配原理图 二、入口 springboot的核心注解SpringBootApplication 接着看 SpringBootApplication 注解 截图&#xff1a; 代码&#xff1a; Target({ElementType.TYPE}) //注解的适用范围&#xff0c;Type表示注解可以描述在类、接口、注解或者枚举中 Retention(Ret…

10种常用的数据分析思路

概要 数据分析的思路及其重要&#xff0c;以致于我们总是忽略它&#xff0c;重“术”而轻“道”&#xff0c;但其实应该一视同仁。这篇文章讲了表单分析、用户分析、埋点分析、聚类分析等10种分析方法&#xff0c;先学为敬~ 道家曾强调四个字&#xff0c;叫“道、法、术、器”…

MUR8060PT-ASEMI大电流快恢复二极管80A 600V

编辑&#xff1a;ll MUR8060PT-ASEMI大电流快恢复二极管80A 600V 型号&#xff1a;MUR8060PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 最大漏源电流&#xff1a;80A 漏源击穿电压&#xff1a;600V 引脚数量&#xff1a;2 恢复时间&#xff1a;22ns 正向压降&am…

NIO 基础

3. 文件编程 non-blocking io 非阻塞 IO 1.1 Channel & Buffer channel 类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c;而之前的 stream 要么是输入&#…

经典文献阅读之--RigidFusion(动态障碍物SLAM)

0. 简介 在真实的SLAM场景中&#xff0c;我们会发现在遇到大量动态障碍物的场景时候&#xff0c;特别容易造成跟丢的问题。传统的解决方法是通过将动态障碍物滤除&#xff0c;而本文《RigidFusion: Robot Localisation and Mapping in Environments with Large Dynamic Rigid …

物联网到底如何实现万物互联?

前言&#xff1a;作为计算机相关专业的你&#xff0c;绝对听说过物联网这个词&#xff0c;它的解释相比你也听过&#xff0c;叫万物互联&#xff0c;也就是所谓的IOT&#xff0c;但是说实话它到底如何实现的万物互联的你可能还真不知道。不是每个物体都有一个网络接口或者实体接…

蓝牙客户端QBluetoothSocket的使用——Qt For Android

了解蓝牙 经典蓝牙和低功耗蓝牙差异 经典蓝牙&#xff08;Bluetooth Classic&#xff09;&#xff1a;分为基本速率/增强数据速率(BR/EDR)&#xff0c; 79个信道&#xff0c;在2.4GHz的(ISM)频段。支持点对点设备通信&#xff0c;主要用于实现无线音频流传输&#xff0c;已成…

响应式数据大屏开发rem、%、vh/vm

前言 响应式数据大屏开发rem、%、vh/vm 我们在开发数据大屏的时候难免会需要解决响应式问题 &#xff0c;那么响应式是什么呢&#xff1f; 响应式&#xff1a;响应式布局是元素随着屏幕发生宽高大小变化 盒子布局发生变化 通俗的来说&#xff1a; 自适应&#xff1a;元素随着…

设置全局loading

为什么要设置全局loading&#xff1f; 在项目开发过程中&#xff0c;请求接口的时候延迟没有数据&#xff0c;页面感觉狠卡顿&#xff0c;这个时候就要用loading来做一个延迟界面。 但是每个界面都写loading的话就会很复杂&#xff0c;所以今天给大家带来了一个全局loading的…

吴恩达471机器学习入门课程2第2周——手写数字识别(0到9)

手写数字识别的神经网络0-9 1、导包2、ReLU激活函数3 - Softmax函数4 - 神经网络4.1 问题陈述4.2 数据集4.2.1 可视化数据 4.3 模型表示批次和周期损失 (cost) 4.4 预测 使用神经网络来识别手写数字0-9。 1、导包 import numpy as np import tensorflow as tf from keras.mod…

人工智能时代已经开启,它是40年来最重大的技术革命

重读比尔盖茨关于AI的长文《The Age of AI has begun —— Artificial intelligence is as revolutionary as mobile phones and the Internet. 》&#xff08;开启AI时代&#xff1a;人工智能&#xff0c;比肩智能手机和互联网的革命&#xff09;&#xff0c;有了新的见解&…

电脑卡怎么办?4个方法让电脑流畅运行!

案例&#xff1a;我的电脑刚买的时候使用起来很流畅&#xff0c;但用久了之后就越来越卡&#xff0c;有没有办法可以让电脑流畅运行&#xff1f; 电脑是我们日常生活中必不可少的工具&#xff0c;但有时我们会遇到电脑卡顿的问题&#xff0c;这不仅会影响工作效率&#xff0c;…

VS2017 如何引入动态库(图文教程:libwebsocket为例)

目录 1、把想要的库放进适当的位置&#xff1b;&#xff08;以libwebsocket动态库为例&#xff09; 2、将库的头文件包含进来 3、添加对应的库目录 4、链接器——输入中&#xff0c;添加具体的依赖项 5、看当前的动态库&#xff0c;还会依赖其他什么动态库 1、把想要的库放进…

有了这些开源 Icon 库,妈妈再也不担心我的 UI 太丑啦!

Remix Icon Remix Icon 是一套面向设计师和开发者的开源图标库&#xff0c;所有的图标均可免费用于个人项目和商业项目。 与拼凑混搭的图标库不同&#xff0c;Remix Icon 的每一枚图标都是由设计师按照统一规范精心绘制的&#xff0c;在拥有完美像素对齐的基础上&#xff0c;…

分享两个转为数字艺术从业者服务的网站

01 地的数字艺术师、3D设计师、动画制作师和游戏开发人员等人才&#xff0c;为他们提供了多种服务和解决方案。 首先&#xff0c;NewCGer为数字艺术从业者提供了一个交流和学习的平台。该网站上有丰富的行业资讯、技术文章和研究报告等内容&#xff0c;能够及时了解到最新的数…

深度学习应用篇-推荐系统[11]:推荐系统的组成、场景转化指标(pv点击率,uv点击率,曝光点击率)、用户数据指标等评价指标详解

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

Socket TCP/IP协议数据传输过程中的粘包和分包问题

Socket TCP/IP协议数据传输过程中的粘包和分包问题 一&#xff1a;通过图解法来描述一下分包和粘包&#xff0c;这样客户更清晰直观的了解&#xff1a; 下面对上面的图进行解释&#xff1a; 1.正常情况&#xff1a;如果Socket Client 发送的数据包&#xff0c;在Socket Server…