您的位置:首页 > 其它

用Mxnet对California房地产数据做线性回归分析

2017-03-18 00:00 471 查看
改写自去年写的一篇博客《用Mxnet和Tensorflow对California房地产数据做分析》。加了一些新的领悟。

Mxnet和Tensorflow都是我正在学习的东西,因为不熟,所以想多做些练习来加深理解。于是就用California房地产数据来练练手。

这里的California房地产数据引用自sklearn自带的数据集(2万多条数据)。该数据集比正规的版本做了简化,只有9个字段。
其中,特征属性有8个。
feature_names = ["MedInc", "HouseAge", "AveRooms","AveBedrms",
"Population", "AveOccup", "Latitude","Longitude"]

该数据的目标值是该区域的平均房价。也就是说需要预测的是精确的平均房价,而不是分类标签。具体代码如下:

# coding=utf-8
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler
import numpy as np
import mxnet as mx
from sklearn.utils import shuffle
import logging

housing = fetch_california_housing()
m, n = housing.data.shape
housing_data_plus_bias = np.c_[np.ones((m, 1)), housing.data]

scaler = StandardScaler()
scaled_housing_data = scaler.fit_transform(housing.data)
scaled_housing_data_plus_bias = np.c_[np.ones((m, 1)), scaled_housing_data]

n_epochs = 15
learning_rate = 0.025
#刚开始的时候,batch_size越大,程序速度就越快。经过一个阈值后,就没多大效果了。而且最终的MSE也没有太多改进。
batch_size =128
# shuffle data
#X, y = shuffle(scaled_housing_data_plus_bias, housing.target)
X, y = (scaled_housing_data_plus_bias, housing.target)

# 定义符号
x_sym = mx.symbol.Variable('data')
y_sym = mx.symbol.Variable('softmax_label')

# 定义网络。这里可以根据需要定义多层网络,例如下面定义了3层网络,最后输出到线性回归处理器里
fc1 = mx.symbol.FullyConnected(data=x_sym, num_hidden=40, name='pre')
act1 = mx.symbol.Activation(data = fc1, name='act1', act_type="relu")
fc2 = mx.sym.FullyConnected(data=act1, name='fc2', num_hidden=20)
act2 = mx.symbol.Activation(data = fc2, name='act2', act_type="relu")
fc3 = mx.sym.FullyConnected(data=act2, name='fc3', num_hidden=1)
# mxnet自带的线性回归
loss = mx.symbol.LinearRegressionOutput(data=fc3,label=y_sym, name='loss')

# 定义模型
model = mx.model.FeedForward(
ctx=mx.cpu(), symbol=loss, num_epoch=n_epochs,
learning_rate=learning_rate,
optimizer='adam'
)
logging.basicConfig(level=logging.INFO)

# Build iterator
slice_index=20500
train_iter = mx.io.NDArrayIter(data=X[:18000], label=y[:18000], batch_size=batch_size, shuffle=True)
eval_iter = mx.io.NDArrayIter(data=X[18000:slice_index], label=y[18000:slice_index], batch_size=batch_size, shuffle=True)

test_iter=mx.io.NDArrayIter(data=X[slice_index:slice_index+1],  shuffle=False)

#训练时打印出mse和rmse指标
eval_metrics = ['mse']
eval_metrics.append('rmse')
#训练
model.fit(X = train_iter,
eval_metric=eval_metrics,
eval_data=eval_iter)
#预测测试例子
r=model.predict(test_iter)
#打印预测结果和真实值,对比看看
print (r,y[slice_index:slice_index+1])

因为使用了多层神经网络训练,训练结果比原来使用一层的神经网络看起来要好些,MSE指标从0.54下降到0.34左右。所以,神经网络深一些,模型的效果确实会好一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mxnet 线性回归
相关文章推荐