线性回归csv数据集_用mxnet的gluon线性回归训练只有两个特征的数据集
前言
自從上次試著用最基礎(chǔ)的線性回歸訓(xùn)練一個(gè)有80個(gè)特征的數(shù)據(jù)集,梯度爆炸之后,今天拿一個(gè)簡(jiǎn)單到不能再簡(jiǎn)單的數(shù)據(jù)集試試能不能成功收斂。途中我們又會(huì)遇到什么問(wèn)題?
數(shù)據(jù)集
來(lái)自吳恩達(dá)機(jī)器學(xué)習(xí)課程第二周的課后練習(xí)。原本是txt文件,我通過(guò)下面三行代碼把數(shù)據(jù)集另存為了csv,可以在這里下載。
import pandas as pd df = pd.read_csv("ex1data2.txt",delimiter=',') df.columns=['size','bedroom','price'] df.to_csv('house_simple.csv')讀取數(shù)據(jù)集
數(shù)據(jù)沒(méi)有分訓(xùn)練集和測(cè)試集,房子的特征只有面積和房間數(shù)兩個(gè)。 我們將通過(guò)pandas庫(kù)讀取并處理數(shù)據(jù)
導(dǎo)入這里需要的包
%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)預(yù)處理數(shù)據(jù)集
我們對(duì)連續(xù)數(shù)值的特征做標(biāo)準(zhǔn)化(standardization):設(shè)該特征在整個(gè)數(shù)據(jù)集上的均值為$mu$,標(biāo)準(zhǔn)差為$sigma$。那么,我們可以將該特征的每個(gè)值先減去$mu$再除以$sigma$得到標(biāo)準(zhǔn)化后的每個(gè)特征值。對(duì)于缺失的特征值,我們將其替換成該特征的均值。
data = data.apply(lambda x: (x - x.mean()) / (x.std()))data.fillna(0);標(biāo)準(zhǔn)化后,每個(gè)特征的均值變?yōu)?,所以可以直接用0來(lái)替換缺失值。
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
把數(shù)據(jù)集分成兩部分,訓(xùn)練集和測(cè)試集,并通過(guò)values屬性得到NumPy格式的數(shù)據(jù),并轉(zhuǎn)成NDArray方便后面的訓(xùn)練。
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)>定義模型
我們使用一個(gè)基本的線性回歸模型和平方損失函數(shù)來(lái)訓(xùn)練模型。 關(guān)于更多gluon使用的步驟請(qǐng)參考這里
net = nn.Sequential() net.add(nn.Dense(1))初始化模型參數(shù)
net.initialize(init.Normal(sigma=0.01))定義損失函數(shù)
loss = gloss.L2Loss()定義優(yōu)化算法
創(chuàng)建一個(gè)Trainer實(shí)例,并指定學(xué)習(xí)率為0.03的小批量隨機(jī)梯度下降(sgd)為優(yōu)化算法。該優(yōu)化算法將用來(lái)迭代net實(shí)例所有通過(guò)add函數(shù)嵌套的層所包含的全部參數(shù)。這些參數(shù)可以通過(guò)collect_params函數(shù)獲取。
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.03})訓(xùn)練模型
隨機(jī)讀取包含batch_size個(gè)數(shù)據(jù)樣本的小批量
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后記
暫時(shí)看訓(xùn)練是能收斂的,損失也比上次少很多很多。下次我們?cè)倏磶讉€(gè)問(wèn)題: + 怎么算測(cè)試集的房?jī)r(jià) + 有沒(méi)有過(guò)擬 + 損失函數(shù)的結(jié)果怎么看,是大還是小
新手村的小伙伴們,你們有什么看法呢?
此處圍觀我的github 博客,這里下載本文代碼
續(xù)集
總結(jié)
以上是生活随笔為你收集整理的线性回归csv数据集_用mxnet的gluon线性回归训练只有两个特征的数据集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab gui学习手记_MATLA
- 下一篇: 禅道项目管理_禅道 11.6.1 版本发