线性回归csv数据集_用mxnet的gluon线性回归训练只有两个特征的数据集
前言
自從上次試著用最基礎的線性回歸訓練一個有80個特征的數據集,梯度爆炸之后,今天拿一個簡單到不能再簡單的數據集試試能不能成功收斂。途中我們又會遇到什么問題?
數據集
來自吳恩達機器學習課程第二周的課后練習。原本是txt文件,我通過下面三行代碼把數據集另存為了csv,可以在這里下載。
import pandas as pd df = pd.read_csv("ex1data2.txt",delimiter=',') df.columns=['size','bedroom','price'] df.to_csv('house_simple.csv')讀取數據集
數據沒有分訓練集和測試集,房子的特征只有面積和房間數兩個。 我們將通過pandas庫讀取并處理數據
導入這里需要的包
%matplotlib inline import d2lzh as d2l from mxnet import autograd, gluon, init, nd from mxnet.gluon import data as gdata, loss as gloss, nn import numpy as np import pandas as pd data = pd.read_csv('data/house/house_2_features.csv' ,index_col=0) data.head()size bedroom price 0 1600 3 329900 1 2400 3 369000 2 1416 2 232000 3 3000 4 539900 4 1985 4 299900
data.shape (46, 3)預處理數據集
我們對連續數值的特征做標準化(standardization):設該特征在整個數據集上的均值為$mu$,標準差為$sigma$。那么,我們可以將該特征的每個值先減去$mu$再除以$sigma$得到標準化后的每個特征值。對于缺失的特征值,我們將其替換成該特征的均值。
data = data.apply(lambda x: (x - x.mean()) / (x.std()))data.fillna(0);標準化后,每個特征的均值變為0,所以可以直接用0來替換缺失值。
data.head()size bedroom price 0 -0.495977 -0.226166 -0.073110 1 0.499874 -0.226166 0.236953 2 -0.725023 -1.526618 -0.849457 3 1.246762 1.074287 1.592190 4 -0.016724 1.074287 -0.311010
把數據集分成兩部分,訓練集和測試集,并通過values屬性得到NumPy格式的數據,并轉成NDArray方便后面的訓練。
n_train=36 train_features = nd.array(data[['size','bedroom']][:n_train].values) test_features = nd.array(data[['size','bedroom']][n_train:].values) train_labels = nd.array(data.price[:n_train].values).reshape((-1, 1)) train_features.shape (36, 2) train_features[:3] [[-0.4959771 -0.22616564][ 0.4998739 -0.22616564][-0.72502285 -1.526618 ]] <NDArray 3x2 @cpu(0)>定義模型
我們使用一個基本的線性回歸模型和平方損失函數來訓練模型。 關于更多gluon使用的步驟請參考這里
net = nn.Sequential() net.add(nn.Dense(1))初始化模型參數
net.initialize(init.Normal(sigma=0.01))定義損失函數
loss = gloss.L2Loss()定義優化算法
創建一個Trainer實例,并指定學習率為0.03的小批量隨機梯度下降(sgd)為優化算法。該優化算法將用來迭代net實例所有通過add函數嵌套的層所包含的全部參數。這些參數可以通過collect_params函數獲取。
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.03})訓練模型
隨機讀取包含batch_size個數據樣本的小批量
batch_size=4 train_iter = gdata.DataLoader(gdata.ArrayDataset(train_features, train_labels), batch_size, shuffle=True) num_epochs = 10 for epoch in range(1, num_epochs + 1):for X, y in train_iter:with autograd.record():l = loss(net(X), y)l.backward()trainer.step(batch_size)l = loss(net(train_features), train_labels)print('epoch %d, loss: %f' % (epoch, l.mean().asnumpy())) epoch 1, loss: 0.349735 epoch 2, loss: 0.255017 epoch 3, loss: 0.207258 epoch 4, loss: 0.180886 epoch 5, loss: 0.166463 epoch 6, loss: 0.156838 epoch 7, loss: 0.150244 epoch 8, loss: 0.145748 epoch 9, loss: 0.142224 epoch 10, loss: 0.139501后記
暫時看訓練是能收斂的,損失也比上次少很多很多。下次我們再看幾個問題: + 怎么算測試集的房價 + 有沒有過擬 + 損失函數的結果怎么看,是大還是小
新手村的小伙伴們,你們有什么看法呢?
此處圍觀我的github 博客,這里下載本文代碼
續集
總結
以上是生活随笔為你收集整理的线性回归csv数据集_用mxnet的gluon线性回归训练只有两个特征的数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab gui学习手记_MATLA
- 下一篇: 禅道项目管理_禅道 11.6.1 版本发