线性回归模型的 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

原文地址:https://www.cnblogs.com/timssd/p/12578528.html

时间: 2024-10-08 13:44:12

线性回归模型的 MXNet 与 TensorFlow 实现的相关文章

用Tensorflow完成简单的线性回归模型

思路:在数据上选择一条直线y=Wx+b,在这条直线上附件随机生成一些数据点如下图,让TensorFlow建立回归模型,去学习什么样的W和b能更好去拟合这些数据点. 1)随机生成1000个数据点,围绕在y=0.1x+0.3 周围,设置W=0.1,b=0.3,届时看构建的模型是否能学习到w和b的值. import numpy as np import tensorflow as tf import matplotlib.pyplot as plt num_points=1000 vectors_se

tensorflow入门(1):构造线性回归模型

今天让我们一起来学习如何用TF实现线性回归模型.所谓线性回归模型就是y = W * x + b的形式的表达式拟合的模型. 我们先假设一条直线为 y = 0.1x + 0.3,即W = 0.1,b = 0.3,然后利用随机数在这条直线附近产生1000个随机点,然后利用tensorflow构造的线性模型去学习,最后对比模型所得的W和b与真实值的差距即可. (某天在浏览Github的时候,发现了一个好东西,Github上有一个比较好的有关tensorflow的Demo合集,有注释有源代码非常适合新手入

线性模型(3)——多重线性回归模型

前面介绍了简单线性回归模型,接下来讲多重线性回归模型. 简单线性回归是针对一个因变量和一个自变量之间的线性回归关系,而多重线性回归是指一个因变量和多个自变量之间的线性回归关系.相对于简单线性回归,多重线性回归更具有实际意义,因为在实际生活中,多因素相互作用非常普遍,同时对因变量造成影响的往往不止一个自变量. 多重线性回归主要解决的问题是1.估计自变量与因变量之间的线性关系(估计回归方程)2.确定哪些自变量对因变量有影响(影响因素分析)3.确定哪个自变量对因变量最影响最大,哪个最小(自变量重要性分

一元线性回归模型与最小二乘法及其C++实现

原文:http://blog.csdn.net/qll125596718/article/details/8248249 监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等),如果预测的变量是连续的,我们称其为回归.回归分析中,如果只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析.如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析.对于二维空间线性是一条直线:对于三维空间线性是一

R语言解读多元线性回归模型

转载:http://blog.fens.me/r-multi-linear-regression/ 前言 本文接上一篇R语言解读一元线性回归模型.在许多生活和工作的实际问题中,影响因变量的因素可能不止一个,比如对于知识水平越高的人,收入水平也越高,这样的一个结论.这其中可能包括了因为更好的家庭条件,所以有了更好的教育:因为在一线城市发展,所以有了更好的工作机会:所处的行业赶上了大的经济上行周期等.要想解读这些规律,是复杂的.多维度的,多元回归分析方法更适合解读生活的规律. 由于本文为非统计的专业

线性回归模型

线性回归模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数.然后利用这个模型去预测/分类新的数据. 线性回归形式简单,易于建模.许多更为强大的非线性模型可以在该模型基础上引入层级结构或高维映射而得. 线性回归模型基本形式 给定由d个属性表述的示例x=(X1,X2,X3...),期中每个Xi表示x在第i个属性上的取值,线性模型试图去学得一个通过属性的线性组合来进行预测的函数 f(x)= w1X1+w2X2+w3X3+...+wdXd+b 向量表示: f(x) = wTx+b 期中

【scikit-learn】scikit-learn的线性回归模型

 内容概要 怎样使用pandas读入数据 怎样使用seaborn进行数据的可视化 scikit-learn的线性回归模型和用法 线性回归模型的评估測度 特征选择的方法 作为有监督学习,分类问题是预測类别结果,而回归问题是预測一个连续的结果. 1. 使用pandas来读取数据 Pandas是一个用于数据探索.数据处理.数据分析的Python库 In [1]: import pandas as pd In [2]: # read csv file directly from a URL and

线性回归模型(Linear Regression)及Python实现

线性回归模型(Linear Regression)及Python实现 http://www.cnblogs.com/sumai 1.模型 对于一份数据,它有两个变量,分别是Petal.Width和Sepal.Length,画出它们的散点图.我们希望可以构建一个函数去预测Sepal.Length,当我们输入Petal.Width时,可以返回一个预测的Sepal.Length.从散点图可以发现,可以用一条直线去拟合,这时我们可以构建一元线性回归模型:hθ(x) = θ0 + θ1x1 (x1= Pe

【机器学习实战】多元线性回归模型

在许多实际问题中,影响因变量Y的自变量不止一个,通常设为p个,此时无法借助于图形的帮助来确定模型,这里则使用一种最为简单且普遍的模型--多元线性模型来进行回归计算. 1.数学模型 当影响Y值的因素不唯一时,我们可以使用多元线性回归模型: 当未知参数有两个时,我们可以画出此方程的图形表示(此时是一个平面,如图).如果未知数大于2时,则很难把此超平面给画出来. 如上图,为了求得等参数的值,我们由各个样本点(图中为红点)做一条平行于Y轴的直线,此直线交平面方程于一点,然后我们求得此线段的程度,并进行平