线性回归

什么叫回归,什么叫分类?

对连续型变量做预测叫回归,对离散型变量做预测叫分类

线性回归的主要任务是什么?

线性回归的任务是找到一个从特征空间X到输出空间Y的最优的线性映射函数

什么是线性回归

简单地说就是,给定由d个属性描述的示例

线性回归试图学得一个通过属性的线性组合来进行预测的函数,即

简单的线性回归

在这里我们只讨论一种最简单的情形:输入的属性数目只有一个。对于离散属性,若属性间存在“序”关系,可通过连续化将其转化为连续值,例如二值属性“身高”的取值“高”“矮”可转化为{1.0,0.0},三值属性“高度”的取值“高”“中”“低”,可转化为{1.0,0.5,0.0};若属性间不存在序关系,假定有k个属性值,则通常转化为k维向量,例如属性“瓜类”的取值“西瓜”,“南瓜”,“黄瓜”可转化为(0,0,1),(0,1,0),(1,0,0).
线性回归试图学得


这里我们可以使用均方误差确定w和b。均方误差是回归任务中最常用的性能度量,因此我们试图让均方误差最小化,即

基于均方误差最小化来进行模型求解的方法称为“最小二乘法”,在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧式距离之和最小。
求解w和b使上面公式最小化的过程,称为线性回归模型的最小二乘“参数估计”,分别对w和b求导可得

令上面两条公式为零可得到w和b最优解的闭式解

这里举一个例子:这个例子是预测住房价格的,我们要使用一个数据集。在这里,我要根据不同房屋尺寸所售出的价格,画出我的数据集。比方说,如果你朋友的房子是1250平方尺大小,你要告诉他们这房子能卖多少钱。那么,你可以做的一件事就是构建一个模型,也许是条直线,从这个数据模型上来看,也许你可以告诉你的朋友,他能以大约220000(美元)左右的价格卖掉这个房子。


多元线性回归

更多的情形,样本是由多个属性描述的,此时,我们试图学得

类似的可利用最小二乘法来对w和b进行估计。

简单的线性回归实现

这是一个简单的线性回归,也就是只有一个变量的线性回归。

import numpy as np

def fitSLR(x, y):
    '''
    训练简单线性模型
    '''
    n = len(x)      # 获取数据集长度
    dinominator = 0 # 分母
    numerator = 0   # 分子
    for i in range(0, n):
        numerator += (x[i] - np.mean(x))*y[i] 
        dinominator += (x[i] - np.mean(x))**2
    b1 = numerator/float(dinominator) # 回归线斜率
    b0 = np.mean(y)-b1*np.mean(x)     # 回归线截距
    return b0, b1

def predict(x, b0, b1):
    '''
    根据学习算法做预测
    '''
    return b0 + x*b1

x = [1, 3, 2, 1, 3]
y = [14, 24, 18, 17, 27]

b0, b1 = fitSLR(x, y)

print("intercept:", b0, " slope:", b1)

x_test = 6

y_test = predict(6, b0, b1)

print("y_test:", y_test)

#输出
#intercept: 10.0  slope: 5.0
#y_test: 40.0

我们也可以画图看看

# 画图
import matplotlib.pyplot as plt

y_perd = b0 + b1*np.array(x)

plt.scatter(x, y)  #散点图
plt.plot(x, y_perd, color='black')
plt.xlabel("x")
plt.ylabel("y")
plt.axis([0, 6, 0, 30])  # 设置横纵坐标的范围
plt.show()

使用UCI大学公开的数据,跑线性回归

数据的介绍:http://archive.ics.uci.edu/ml/datasets/Combined+Cycle+Power+Plant
数据的下载地址:http://archive.ics.uci.edu/ml/machine-learning-databases/00294/
下载的是一个压缩包,我们把他解压后,是一个xlsx,我们可以先用excel把他打开,然后另存为.csv格式,方便我们读取。
里面是一个循环发电场的数据,共有9568个样本数据,每个数据有5列,分别是:AT(温度), V(压力), AP(湿度), RH(压强), PE(输出电力)。我们的问题是得到一个线性的关系,对应PE是样本输出,而AT/V/AP/RH这4个是样本特征, 机器学习的目的就是得到一个线性回归模型,即:
PE=θ0+θ1∗AT+θ2∗V+θ3∗AP+θ4∗RH
而需要学习的,就是θ0,θ1,θ2,θ3,θ4θ0,θ1,θ2,θ3,θ4这5个参数。

用pandas来读取数据
import numpy as np
import pandas as pd

pd.set_option('display.max_columns', None)  # 输出结果显示全部列

# 读取数据,从第1行开始
data = pd.read_csv(r"ccpp.csv", header=0)

验证一下看是否读取成功,输出数据的前5行

# 显示数据的前五行,如果是最后五行,用data.tail(),默认为5行
print(data.head())
# 查看描述性统计,只能看数值型数据.
#print(data.describe())
准备运行算法的数据
# 显示数据的维度
print(data.shape)
# 现在我们开始准备样本特征X,我们用AT, V,AP和RH这4个列作为样本特征
x = data[['AT', 'V', 'AP', 'RH']]
# 接着我们准备样本输出y, 我们用PE作为样本输出
y = data[['PE']]
划分训练集和数据集
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
# 查看训练集和测试集的维度
# print('x_train.shape:', x_train.shape)
# print('x__test.shape:', x_test.shape)
# print('y_train.shape:', y_train.shape)
# print('y_test.shape:', y_test.shape)
运行scikit-learn的线性模型
# 从sklearn库中导入线性回归函数
from sklearn.linear_model import LinearRegression
# 执行函数获得一个线性回归模型
LR = LinearRegression()  # 这是一个未经训练的机器学习模型
# 对模型传入输入数据x_train和输出数据y_train
LR.fit(x_train, y_train)  # 这是一个经过训练的机器学习模型

# 输出线性回归的截距和各个系数
print('LR.intercept_:', LR.intercept_)
print('LR.coef_:', LR.coef_)

输出如下:
LR.intercept_: [452.84103716]
LR.coef_: [[-1.97313099 -0.23649993 0.06387891 -0.15807019]]
也就是说PE与其他的4个变量的关系如下:
PE=452.84103716−1.97313099∗AT−0.23649993∗V+0.06387891∗AP−0.15807019∗RH

评价模型

MSE (Mean Squared Error)叫做均方误差



RMSE(Root Mean Squard Error)均方根误差。


图片.png
# 评价模型。这里使用MSE和RMSE来评价模型的好坏
y_pred = LR.predict(x_test)
# 引入sklearn模型评价工具库
from sklearn import metrics
print("MSE: ", metrics.mean_squared_error(y_test, y_pred))
print("RMSE: ", np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

输出如下:
MSE: 19.73369930349765
RMSE: 4.442262858442491

画图观察结果

这里画图显示真实值和预测值的变化关系,离中间的直线y=x直接越近的点代表预测损失越低。

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
# 画散点图
ax.scatter(y_test, y_pred)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
# 设置标题
ax.set_title('Plot')
# 设置X轴标签
ax.set_xlabel('Measured')
# 设置Y轴标签
ax.set_ylabel('Predicted')
# 显示所画的图
plt.show()


完整的代码可以去我的码云查看。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 一. Numpy的主要功能 数组的算数和逻辑运算。 傅立叶变换和用于图形操作的例程。 线性代数有关的操作。 Num...
    躺在稻田里的小白菜阅读 767评论 0 1
  • “#本文参加“青春”征文大赛,本人保证本文为本人原创,如有问题则与主办方无关,自愿放弃评优评奖资格” 赣南师范大学...
    易招娣阅读 669评论 0 21
  • 卷积神经网络类似于一般的神经网络,由可学习的权重和误差组成,每一个神经元接受一些输入,完成一些非线性的操作。整个神...
    与尔岩说阅读 2,321评论 0 4
  • 6月2号,坚持30天的写作已经是最后一天, 首先感到的是轻松,最近工作开始忙起来,时间安排紧张,加班又开始成为常...
    木本秋阅读 303评论 0 0
  • 可能是我太过矫情 受过一次伤多久都不敢再提感情 时间久了,可以继续跟别人嘻嘻哈哈的开玩笑,但是只有自己...
    C藏好森林阅读 261评论 0 4