机器学习接口和代码之 线性回归

线性回归sklearn 接口和代码

官网api:https://scikit-learn.org/stable/modules/linear_model.html#ordinary-least-squares

LinearRegression

class sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)参数说明:fit_intercept:bool,选择是否需要计算截距,默认为True,如果中心化了的数据可以选择falsenormalize:bool,选择是否需要标准化(在回归之前,对X减去平均值再除以二范数),默认为false,如果fit_intercept被设置为False时,该参数将忽略。在这里还是建议将标准化的工作放在训练模型之前。通过设置sklearn.preprocessing.StandardScaler来实现,而在此处设置为falsecopy_x:bool量,选择是否复制X数据,默认True,如果不复制数据,数据在运行过程中修改,不会覆盖原始数据,如果否,可能会因为中心化把X数据覆盖n_job:int量,选择几核用于计算,默认1,-1表示全速运行# 其实这里面的参数基本都不怎么需要涉及,往往默认参数就够用。可用属性:coef_:训练后的输入端模型系数,如果label有两个,即y值有两列。那么是一个2D的arrayintercept_: 截距

可用的methods

fit

fit(X,y,sample_weight=None): 
参数:X: array, 稀疏矩阵 [n_samples,n_features] y: array [n_samples, n_targets] sample_weight: 权重,形状为[n_samples]的numpy数组 ---------在版本0.17后添加了sample_weight

get_params(deep=True)

 返回对regressor 的设置值

predict(X)

 预测 基于 R^2值

score

评估

案例一:自己实现线性回归,用最小二乘

# -*- coding:utf-8 -*-from sklearn.model_selection import train_test_split # 数据划分的类
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd# 设置字符集,防止中文乱码
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调用更多内存,加快效率)
print(df)## 功率和电流之间的关系
X = df.iloc[:,2:4]
Y = df.iloc[:,5]## 数据分割
X2_train,X2_test,Y2_train,Y2_test = train_test_split(X, Y, test_size=0.2, random_state=0)# 将X和Y转换为矩阵的形式
X = np.mat(X2_train)
Y = np.mat(Y2_train).reshape(-1,1)# 计算θ
theta = (X.T * X).I * X.T * Y
print(theta)# 对测试集合进行测试
y_hat = np.mat(X2_test) * theta# 画图
t=np.arange(len(X2_test))
plt.figure(facecolor='w')
plt.plot(t, Y2_test, 'r-', linewidth=2, label=u'真实值')
plt.plot(t, y_hat, 'g-', linewidth=2, label=u'预测值')
plt.legend(loc = 'lower right')
plt.title(u"线性回归预测功率与电流之间的关系", fontsize=20)
plt.grid(b=True)
plt.show()

案例二:家庭用电预测:线性回归算法(时间与功率&功率与电流之间的关系)

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# 设置字符集,防止中文乱码
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调用更多内存,加快效率)
print(df.head())  # 获取前五行数据
print(df.info())# 异常数据处理(异常数据过滤)
new_df = df.replace('?', np.nan)  # 替换非法字符为np.nan
datas = new_df.dropna(axis=0, how = 'any')  # 只要有一个数据为空,就进行行删除操作
print(datas.describe().T)  # 观察数据的多种统计指标(只能看数值型的)
print(df.info())  # 查看格式信息# 创建一个时间函数格式化字符串
def date_format(dt):# dt显示是一个series/tuple;dt[0]是date,dt[1]是timeimport timet = 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']print(X.head(2))# 对数据集进行测试集合训练集划分
# 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)# 查看训练集上的数据信息(X)
print(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)  # 直接使用在模型构建数据上进行一个数据标准化操作 (测试集)print(pd.DataFrame(X_train).describe())# 模型训练
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)# 输出模型训练得到的相关参数
print("模型的系数(θ):", end="")
print(lr.coef_)
print("模型的截距:", end='')
print(lr.intercept_)# 模型保存/持久化
# 在机器学习部署的时候,实际上其中一种方式就是将模型进行输出;另外一种方式就是直接将预测结果输出
# 模型输出一般是将模型输出到磁盘文件
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)# 预测值和实际值画图比较
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()

案例三:家庭用电预测:线性回归算法(时间与电压的多项式关系)

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipelineimport numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd# 创建一个时间字符串格式化字符串
def date_format(dt):import timet = 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)# 设置字符集,防止中文乱码
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False# 加载数据
path = 'datas\household_power_consumption_200.txt'  ## 200行数据
path = 'datas\household_power_consumption_1000.txt'  ## 1000行数据
df = pd.read_csv(path, sep=';', low_memory=False)# 日期、时间、有功功率、无功功率、电压、电流、厨房用电功率、洗衣服用电功率、热水器用电功率
names2 = df.columns
names = ['Date', 'Time', 'Global_active_power', 'Global_reactive_power', 'Voltage', 'Global_intensity','Sub_metering_1', 'Sub_metering_2', 'Sub_metering_3']# 异常数据处理(异常数据过滤)
new_df = df.replace('?', np.nan)
datas = new_df.dropna(axis=0, how='any')  # 只要有数据为空,就进行删除操作# 时间和电压之间的关系(Linear)
# 获取x和y变量, 并将时间转换为数值型连续变量
X = datas[names[0:2]]
X = X.apply(lambda x: pd.Series(date_format(x)), axis=1)
Y = datas[names[4]].values# 对数据集进行测试集合训练集划分
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)# 数据标准化
ss = StandardScaler()
X_train = ss.fit_transform(X_train)  # 训练并转换
X_test = ss.transform(X_test)  # 直接使用在模型构建数据上进行一个数据标准化操作# 模型训练
lr = LinearRegression()
lr.fit(X_train, Y_train)  # 训练模型# 模型预测
y_predict = lr.predict(X_test)# 模型效果
print("准确率:", lr.score(X_test, Y_test))# 预测值和实际值画图比较
t = np.arange(len(X_test))
plt.figure(facecolor='w')
plt.plot(t, Y_test, 'r-', linewidth=2, label=u'真实值')
plt.plot(t, y_predict, 'g-', linewidth=2, label=u'预测值')
plt.legend(loc='lower right')
plt.title(u"线性回归预测时间和功率之间的关系", fontsize=20)
plt.grid(b=True)  # 网格
plt.show()# 时间和电压之间的关系(Linear-多项式)
# Pipeline:管道的意思,讲多个操作合并成为一个操作
# Pipleline总可以给定多个不同的操作,给定每个不同操作的名称即可,执行的时候,按照从前到后的顺序执行
# Pipleline对象在执行的过程中,当调用某个方法的时候,会调用对应过程的对应对象的对应方法
# eg:在下面这个案例中,调用了fit方法,
# 那么对数据调用第一步操作:PolynomialFeatures的fit_transform方法对数据进行转换并构建模型
# 然后对转换之后的数据调用第二步操作: LinearRegression的fit方法构建模型
# eg: 在下面这个案例中,调用了predict方法,
# 那么对数据调用第一步操作:PolynomialFeatures的transform方法对数据进行转换
# 然后对转换之后的数据调用第二步操作: LinearRegression的predict方法进行预测
models = [Pipeline([('Poly', PolynomialFeatures()),  # 给定进行多项式扩展操作, 第一个操作:多项式扩展('Linear', LinearRegression(fit_intercept=False))  # 第二个操作,线性回归])
]
model = models[0]
# 获取x和y变量, 并将时间转换为数值型连续变量
X = datas[names[0:2]]
X = X.apply(lambda x: pd.Series(date_format(x)), axis=1)
Y = datas[names[4]]# 对数据集进行测试集合训练集划分
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)# 数据标准化
ss = StandardScaler()
X_train = ss.fit_transform(X_train)  # 训练并转换
X_test = ss.transform(X_test)  # 直接使用在模型构建数据上进行一个数据标准化操作# 模型训练
t = np.arange(len(X_test))
N = 5
d_pool = np.arange(1, N, 1)  # 阶
m = d_pool.size
clrs = []  # 颜色
for c in np.linspace(16711680, 255, m):clrs.append('#%06x' % int(c))
line_width = 3plt.figure(figsize=(12, 6), facecolor='w')  # 创建一个绘图窗口,设置大小,设置颜色
for i, d in enumerate(d_pool):plt.subplot(N - 1, 1, i + 1)plt.plot(t, Y_test, 'r-', label=u'真实值', ms=10, zorder=N)# 设置管道对象中的参数值,Poly是在管道对象中定义的操作名称, 后面跟参数名称;中间是两个下划线model.set_params(Poly__degree=d)  # 设置多项式的阶乘model.fit(X_train, Y_train)  # 模型训练# Linear是管道中定义的操作名称# 获取线性回归算法模型对象lin = model.get_params()['Linear']output = u'%d阶,系数为:' % d# 判断lin对象中是否有对应的属性if hasattr(lin, 'alpha_'):idx = output.find(u'系数')output = output[:idx] + (u'alpha=%.6f, ' % lin.alpha_) + output[idx:]if hasattr(lin, 'l1_ratio_'):idx = output.find(u'系数')output = output[:idx] + (u'l1_ratio=%.6f, ' % lin.l1_ratio_) + output[idx:]print(output, lin.coef_.ravel())# 模型结果预测y_hat = model.predict(X_test)# 计算评估值s = model.score(X_test, Y_test)# 画图z = N - 1 if (d == 2) else 0label = u'%d阶, 准确率=%.3f' % (d, s)plt.plot(t, y_hat, color=clrs[i], lw=line_width, alpha=0.75, label=label, zorder=z)plt.legend(loc='upper left')plt.grid(True)plt.ylabel(u'%d阶结果' % d, fontsize=12)# 预测值和实际值画图比较
plt.suptitle(u"线性回归预测时间和功率之间的多项式关系", fontsize=20)
plt.grid(b=True)
plt.show()

 

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

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

相关文章

中国智慧VS西方智慧-看中国IT风云与IT产业怪状

为什么国外没有一家互联网公司在中国取得成功,为什么他们都水土不服,为什么他们都在中国都混不下去,YAHOO, EBAY等等这样享誉全球的互联网公司都在中国无法取得成功!为什么连让IT巨无霸微软都觉得发抖,让比尔盖茨夜夜做…

商务搜索引擎_外贸研修 | 世界各国常用搜索引擎,开发客户必备!

我们平时生活中也好,开发客户也好,搜索引擎是我们离不开的工具。最佳没有之一的当属谷歌了。谷歌网址:www.google.com谷歌高级搜索:https://www.google.com/advanced_search (通过设置/排除一些字词缩小精确搜索范围)作为普通使用…

HaProxy+Keepalived+Mycat高可用群集配置

概述 本章节主要介绍配置HaProxyKeepalived高可用群集,Mycat的配置就不在这里做介绍,可以参考我前面写的几篇关于Mycat的文章。 部署图: 配置 HaProxy安装 181和179两台服务器安装haproxy的步骤一致 --创建haproxy用户 useradd haproxy--…

奇怪的bug,不懂Atom在添加markdown-themeable-pdf,在配置好phantomjs的情况下报错

本来打算用一下atom但是导出pdf报错,可是在预览的情况下就没有问题,顺便吐槽一下谷歌浏览器自己的markdown在线预览插件无法适配,用搜狗搭载谷歌的插件才能导出pdf,一下感觉逼格少了很多,等忙完这阵再来看一下。先贴出…

机器学习之 sklearn.preprocessing 模块

sklearn.preprocessing.PolynomialFeatures 多项式扩展。 它是使用多项式的方法来进行的,如果有a,b两个特征,那么它的2次多项式为(1,a,b,a^2,ab, b^2),这个多项式的形式是使用poly的效果。 api class s…

Python 面试题

Python面试315道题第一部 Python面试题基础篇(80道)1、为什么学习Python?2、通过什么途径学习的Python?3、Python和Java、PHP、C、C#、C等其他语言的对比?PHPjavacc#c4、简述解释型和编译型编程语言?编译型…

周鸿祎,高司令

还是感到有必要将自己的一些想法快速记下来。 首先是对周鸿祎新员工演讲的看法。 就说实话这一点来说,周鸿祎比很多人强。所以我比较喜欢引用他的话,确实比较实在,不装逼。 至于一个公司招人的风格,是公司自己定的,别人…

JDBC与JNDI应用比较

JNDI用了多年但是一直没去弄懂其和JDBC的区别,今天在网上搜了下,发下些资料说明的还不错记录下。 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专…

bzoj1038500AC!

序列dp 先开始想了一个类似区间dp的东西...少了一维 然后发现似乎不太对,因为女生的最大差和男生的最大差并不相等 dp[i][j][x][y]表示当前有i个人,j个男生,男生和女生的后缀最大差是x,女生和男生最大差是y,x,y>0,转…

机器学习接口代码之 Ridge、Lasso、Elasitc Net

目录 Ridge Regression (岭回归) Lasso Regression Elasitc Net(弹性网络) 案例:葡萄酒质量预测 官网地址https://scikit-learn.org/stable/modules/linear_model.html Ridge Regression (岭回归&…

公司技术管理角度看C++游戏程序员发展

公司技术管理角度看C游戏程序员发展 H3D 这是我多年来招聘培训游戏程序员的一点想法。一直想汇总一下。主要目的是为了更好的对公司新进C程序员进行培训,并且建立起游戏程序员培训,发展,成才,成为核心骨干,管理层&am…

android生命周期_Android开发 View的生命周期结合代码详解

咱们以TextView控件为例:/*** Created by SunshineBoy on 2020/9/23.*/public class TestTextView extends android.support.v7.widget.AppCompatTextView {public TestTextView(Context context) {super(context);Log.e("TestTextView","TestTextVi…

salt

安装服务端和客户端服务端(marster)yum install salt-master -y客户端(slave)yum install salt-minion -ymarster192.168.11.17/etc/init.d/salt-master start配置文件: vi /etc/salt/mastercat master|egrep -v ;|#|^$auto_accept:True #设置自动接受日志: /var/log/salt/mas…

python | 查看pip支持的文件名和版本

python | 查看pip支持的文件名和版本win下查询大哥推荐已经解决win下查询 import pip._internalprint(pip._internal.pep425tags.get_supported())64位的需要在pip后面加个_internal 如果不行试试下边的 大哥推荐已经解决 import wheel.pep425tags as w print(w.get_suppor…

机器学习算法之支持向量机 SVM

距离知识 点到直线/平面的距离公式: 1、假定点p(x0,y0),平面方程为f(x,y)AxByC,那么点p到平面f(x)的距离为: 2、从三维空间扩展到多维空间中,如果存在一个超平面f(X)θXb; 那么某一个点X0到这个超平面的距离为: 参考…

set IDENTITY_INSERT on 和 off 的设置

批量插入记录时,对有标识列的字段要设置 set IDENTITY_INSERT 表名 on,然后再执行插入记录操作;插入完毕后恢复为 off 设置 转载于:https://www.cnblogs.com/TTonly/p/10349931.html

VMware Horizon虚拟桌面工具箱2.0-审计,远程协助,控制台,电源

各位朋友,大家好,VMware Horizon 虚拟桌面工具箱2.0版本,已经面世啦!在2.0 版本中我们添加了vSphere虚拟机控制台访问、开机策略和图形化安装这三个新功能,并改进了部分老的功能。老版本即1.5版本的相关知识可以参考我的博文VMware Horizon虚拟桌面工具箱之审计与远…

python词云改颜色_一种用Python生成词云

一种用Python生成词云 我们在阅读一篇很长的文章时,总先看看文章的关键词来获知文章的大概内容。今天我们就来制作一个词云程序,将文章中出现次数较多的词语提取出来,生成一张词云图。词云图的生成原理: 程序会将这篇文章中的所有…

什么是程序员正确的职场心态?

(本文为《程序员羊皮卷》最新公布的第七章的一部分,下载地址:http://download.csdn.net/source/1868065 或者http://zhaopinpro.com/wordpress/wp-content/uploads/2009/12/《程序员羊皮卷》第7章-程序员职场心态.doc 欢迎大家购买作者签名…

git第一次提交代码至远程仓库步骤

git第一次提交代码至远程仓库步骤在将要提交的文件目录下打开Git Bash Here1.git init git add . 提交该目录下的所有文件 3.git commit -am “qiantai”(提交到本地仓库) 4.git remote add origin *** (***git地址) 5.git push -u -f origin master(提交到远程仓库&#x…