线性回归模型的 MXNet 与 TensorFlow 实现
本文主要探索如何使用深度学习框架 MXNet 或 TensorFlow 实现线性回归模型?并且以 Kaggle 上数据集 USA_Housing 做线性回归任务来预测房价。
回归任务,scikit-learn 亦可以实现,具体操作可以查看 线性回归模型的原理与 scikit-learn 实现。
载入数据
import pandas as pd
import numpy as np
name = '../dataset/USA_Housing.csv'
dataset = pd.read_csv(name)
train = dataset.iloc[:3000,:]
test = dataset.iloc[3000:,:]
print(train.shape)
print(test.shape)
(3000, 7)
(2000, 7)
查看有无缺失值:
print(np.unique(train.isnull().any()))
print(np.unique(test.isnull().any()))
[False]
[False]
dataset.columns # 查看所有特征名称
Index(['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms',
'Avg. Area Number of Bedrooms', 'Area Population', 'Price', 'Address'],
dtype='object')
我们不考虑 'Address'
特征。通过特征 'Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms', 'Avg. Area Number of Bedrooms', 'Area Population'
来预测 'Price'
。
features_column = [
name for name in dataset.columns if name not in ['Price', 'Address']
]
label_column = ['Price']
x_train = train[features_column]
y_train = train[label_column]
x_test = test[features_column]
y_test = test[label_column]
为了更好的理解线性回归的原理,我们先动手自己实现:
数据标准化
线性回归模型就是单层神经网络,在神经网络的训练中,需要将数据进行标准化处理,使得数据的尺度统一。
from sklearn.preprocessing import scale
标准化处理:
x_train_s = scale(x_train)
x_test_s = scale(x_test)
为了更红的管理数据集我们先定义一个针对数据集处理的统一 API:Loader
。为了和不同的深度学习框架进行接洽,Loader
被限制为输出 Numpy 数组。
class Loader(dict):
"""
方法
========
L 为该类的实例
len(L)::返回样本数目
iter(L)::即为数据迭代器
Return
========
可迭代对象(numpy 对象)
"""
def __init__(self, batch_size, X, Y=None, shuffle=True, name=None):
'''
X, Y 均为类 numpy, 可以是 HDF5
'''
if name is not None:
self.name = name
self.X = np.asanyarray(X[:])
if Y is None:
# print('不存在标签!')
self.Y = None
else:
self.Y = np.asanyarray(Y[:])
self.batch_size = batch_size
self.shuffle = shuffle
self.nrows = self.X.shape[0]
def __iter__(self):
idx = np.arange(self.nrows)
if self.shuffle:
np.random.shuffle(idx)
for k in range(0, self.nrows, self.batch_size):
K = idx[k:min(k + self.batch_size, self.nrows)]
if self.Y is None:
yield np.take(self.X, K, 0)
else:
yield np.take(self.X, K, 0), np.take(self.Y, K, 0)
def __len__(self):
return self.nrows
由于预测的值很大,为了加快训练速度,我们将其转换为:
batch_size = 64
trainset = Loader(batch_size, x_train_s, y_train)
MXNet 训练
from mxnet import nd, autograd
from mxnet.gluon import nn
def linreg(X, w, b):
'''
线性回归模型
'''
return nd.dot(X, w) + b
def squared_loss(y_hat, y):
'''
l_2 损失
'''
return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2
def sgd(params, lr, batch_size):
for param in params:
param[:] -= lr * param.grad / batch_size
%%time
n_features = x_train.shape[1]
# 参数初始化
w = nd.random_normal(shape=(n_features, 1))
b = nd.zeros([1])
params = [w, b]
for param in params:
param.attach_grad()
# 超参数设定
lr = .45
epochs = 10
net = linreg
loss = squared_loss
test_l = []
for epoch in range(epochs):
train_l = 0
for x, y in trainset:
x = nd.array(x, dtype=np.float32)
y = nd.array(y, dtype=np.float32)
with autograd.record():
out = net(x, w, b)
L = loss(out, y)
L.backward()
sgd([w, b], lr, batch_size)
train_l += L.sum().asscalar()
test_l.append(loss(net(nd.array(x_test_s), w, b),
nd.array(y_test)).mean().asscalar())
print(f'Epoch {epoch}, train loss {train_l/len(trainset)}')
Epoch 0, train loss 31618141962.24
Epoch 1, train loss 5227899371.52
Epoch 2, train loss 5213236106.581333
Epoch 3, train loss 5218263345.834666
Epoch 4, train loss 5239229207.893333
Epoch 5, train loss 5258389263.701333
Epoch 6, train loss 5229723735.381333
Epoch 7, train loss 5193707612.842667
Epoch 8, train loss 5248076775.424
Epoch 9, train loss 5249794779.818666
Wall time: 617 ms
%matplotlib inline
from matplotlib import pyplot as plt
plt.plot(test_l)
plt.show()
from sklearn.metrics import r2_score
out = net(nd.array(x_test_s), w, b).asnumpy()
r2_score(y_test, out)
0.9160266711438344
TensorFlow 训练
import tensorflow as tf
def linreg(X, w, b):
'''
线性回归模型
'''
return tf.matmul(X, w) + b
%%time
n_features = x_train.shape[1]
lr = .45
# 参数初始化
w = tf.Variable(tf.random_normal(shape=(n_features, 1)))
b = tf.Variable(tf.zeros([1]))
x = tf.placeholder(tf.float32, [None, n_features])
y = tf.placeholder(tf.float32, [None, 1])
loss = (y - linreg(x, w, b))**2 / 2
train_op = tf.train.GradientDescentOptimizer(lr).minimize(loss)
test_out = linreg(tf.constant(x_test_s, tf.float32), w, b)
init = tf.global_variables_initializer()
epochs = 10
with tf.Session() as sess:
for epoch in range(epochs):
train_l = 0
for data, labels in trainset:
data = data.astype(np.float32)
labels = labels.astype(np.float32)
sess.run(init)
train_, _ = sess.run(
[loss, train_op], feed_dict={
x: data,
y: labels
})
train_l += train_.sum()
print(f'Epoch {epoch}, train loss {train_l/ len(trainset)}')
out = sess.run(test_out)
Epoch 0, train loss 825207346429.952
Epoch 1, train loss 825207220600.832
Epoch 2, train loss 825207307283.1146
Epoch 3, train loss 825207276524.8854
Epoch 4, train loss 825207298894.5067
Epoch 5, train loss 825207349226.1547
Epoch 6, train loss 825207335245.1414
Epoch 7, train loss 825207173065.3867
Epoch 8, train loss 825207325458.432
Epoch 9, train loss 825207249960.96
Wall time: 4.17 s
TensorFlow 与 MXNet 相比,慢了许多。
r2_score(y_test, out)
-9834.739544115224
线性回归模型的 MXNet 与 TensorFlow 实现的更多相关文章
- TensorFlow从1到2(七)线性回归模型预测汽车油耗以及训练过程优化
线性回归模型 "回归"这个词,既是Regression算法的名称,也代表了不同的计算结果.当然结果也是由算法决定的. 不同于前面讲过的多个分类算法或者逻辑回归,线性回归模型的结果是 ...
- tensorflow入门(1):构造线性回归模型
今天让我们一起来学习如何用TF实现线性回归模型.所谓线性回归模型就是y = W * x + b的形式的表达式拟合的模型. 我们先假设一条直线为 y = 0.1x + 0.3,即W = 0.1,b = ...
- 用Tensorflow完成简单的线性回归模型
思路:在数据上选择一条直线y=Wx+b,在这条直线上附件随机生成一些数据点如下图,让TensorFlow建立回归模型,去学习什么样的W和b能更好去拟合这些数据点. 1)随机生成1000个数据点,围绕在 ...
- [tensorflow] 线性回归模型实现
在这一篇博客中大概讲一下用tensorflow如何实现一个简单的线性回归模型,其中就可能涉及到一些tensorflow的基本概念和操作,然后因为我只是入门了点tensorflow,所以我只能对部分代码 ...
- 【scikit-learn】scikit-learn的线性回归模型
内容概要 怎样使用pandas读入数据 怎样使用seaborn进行数据的可视化 scikit-learn的线性回归模型和用法 线性回归模型的评估測度 特征选择的方法 作为有监督学习,分类问题是预 ...
- R语言解读多元线性回归模型
转载:http://blog.fens.me/r-multi-linear-regression/ 前言 本文接上一篇R语言解读一元线性回归模型.在许多生活和工作的实际问题中,影响因变量的因素可能不止 ...
- R语言解读一元线性回归模型
转载自:http://blog.fens.me/r-linear-regression/ 前言 在我们的日常生活中,存在大量的具有相关性的事件,比如大气压和海拔高度,海拔越高大气压强越小:人的身高和体 ...
- 多元线性回归 ——模型、估计、检验与预测
一.模型假设 传统多元线性回归模型 最重要的假设的原理为: 1. 自变量和因变量之间存在多元线性关系,因变量y能够被x1,x2-.x{k}完全地线性解释:2.不能被解释的部分则为纯粹的无法观测到的误差 ...
- 一元线性回归模型与最小二乘法及其C++实现
原文:http://blog.csdn.net/qll125596718/article/details/8248249 监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等), ...
随机推荐
- POJ 3268 Silver Cow Party (最短路径)
POJ 3268 Silver Cow Party (最短路径) Description One cow from each of N farms (1 ≤ N ≤ 1000) convenientl ...
- bzoj2616: SPOJ PERIODNI——笛卡尔树+DP
不连续的处理很麻烦 导致序列DP又找不到优秀的子问题 自底向上考虑? 建立小根堆笛卡尔树 每个点的意义是:高度是(自己-father)的横着的极大矩形 子问题具有递归的优秀性质 f[i][j]i为根子 ...
- GROUP BY和 HAVING 及 统计函数 执行顺序等
[我理解:where是对最外层结果进行条件筛选,而having是对分组时分组中的数据进行 组内条件筛选,注意:只能进行筛选,不能进行统计或计算,所有统计或计算都要放在最外层的select 后面,无论是 ...
- token的理解
今天学习了token,它的英文意思是令牌的意思.在我理解即像通行证一样,在用户登录成功系统后,会为这个用户颁发一个token,这样它去其他系统都免登录,因为有了这个令牌. token的生成我们可以用U ...
- JS中的new操作符
在JS中定义一个构造函数,然后用new操作符构造对象obj,JS代码如下. function Base(){ this.name = "swf"; this.age =20; } ...
- 鸟哥的Linux私房菜——第十五章:正规表示法
视频链接 B站:http://www.bilibili.com/video/av10364761/ 目录如下 1. 前言:2. 基础正规表示法:2.1 以 grep 撷取字符串 (grep -iv ...
- bzoj千题计划286:bzoj1226: [SDOI2009]学校食堂Dining
http://www.lydsy.com/JudgeOnline/problem.php?id=1226 关键点:一个人只能忍受 ‘紧跟’ 在他 后面的b个人比他先打到饭 dp[i][j][k] 前i ...
- 赫夫曼树JAVA实现及分析
一,介绍 1)构造赫夫曼树的算法是一个贪心算法,贪心的地方在于:总是选取当前频率(权值)最低的两个结点来进行合并,构造新结点. 2)使用最小堆来选取频率最小的节点,有助于提高算法效率,因为要选频率最低 ...
- 原生JS不到30行,实现类似javascript MVC的功能-minTemplate
严格来讲不能说是MVC,应为模版里不能写逻辑语句. 灵感来源于我的上篇文字:<封装JSON数据转自定义HTML方法parseHTML>: 这里再封装一个简单方法,在保持原来的方便改变不大的 ...
- [转]linux各文件夹介绍
本文来自linux各文件夹的作用的一个精简版,作为个人使用笔记. 下面简单看下linux下的文件结构,看看每个文件夹都是干吗用的? /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管 ...