(pytorch-深度学习系列)简单实现kaggle房价预测-学习笔记
生活随笔
收集整理的這篇文章主要介紹了
(pytorch-深度学习系列)简单实现kaggle房价预测-学习笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
實現kaggle房價預測
導入所需模塊:
%matplotlib inline import torch import torch.nn as nn import numpy as np import pandas as pdprint(torch.__version__) torch.set_default_tensor_type(torch.FloatTensor)讀取數據集:
(具體以自己存放的數據集的位置為準)
數據集的基本情況:
train_data.shape # 輸出 (1460, 81),訓練數據集包括1460個樣本、80個特征和1個標簽。 test_data.shape # 輸出 (1459, 80),測試數據集包括1459個樣本、80個特征#查看前5個樣本的前4個特征、后2個特征和標簽(SalePrice): train_data.iloc[0:5, [0, 1, 2, 3, -3, -2, -1]]第一個特征是Id,對于機器學習來說,id不能帶來有效的特征信息,所以我們不使用這個屬性作為特征。
# 將所有的訓練數據和測試數據的79個特征按樣本連結 all_features = pd.concat((train_data.iloc[:, 1:-1], test_data.iloc[:, 1:]))對數據進行預處理:
numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index all_features[numeric_features] = all_features[numeric_features].apply(lambda x: (x - x.mean()) / (x.std())) #標準化處理,對所有的特征減去均值,再除以標準差 # 標準化后,每個數值特征的均值變為0,所以可以直接用0來替換缺失值 all_features[numeric_features] = all_features[numeric_features].fillna(0)# dummy_na=True將缺失值也當作合法的特征值并為其創建指示特征 這一步操作相當于進行one_hot編碼 all_features = pd.get_dummies(all_features, dummy_na=True) all_features.shape # (2919, 331),這一步轉換將特征數從79增加到了331#將numpy數據轉化為tensor,便于后面的訓練 n_train = train_data.shape[0] train_features = torch.tensor(all_features[:n_train].values, dtype=torch.float) test_features = torch.tensor(all_features[n_train:].values, dtype=torch.float) train_labels = torch.tensor(train_data.SalePrice.values, dtype=torch.float).view(-1, 1)標準化后,每個數值特征的均值變為0,所以可以直接用0來替換缺失值
使用one_hot編碼將離散的特征分解成多個特征,分解之后的特征可以用0/1來表示,這樣,這個轉換將特征數從79增加到了331
定義模型所需的函數:
loss = torch.nn.MSELoss()def get_net(feature_num):net = nn.Linear(feature_num, 1)for param in net.parameters():nn.init.normal_(param, mean=0, std=0.01)return net#對數均方差損失的實現 def log_rmse(net, features, labels):with torch.no_grad():# 將小于1的值設成1,使得取對數時數值更穩定clipped_preds = torch.max(net(features), torch.tensor(1.0))rmse = torch.sqrt(loss(clipped_preds.log(), labels.log()))return rmse.item()給定預測值y^1,…,y^n\hat y_1, \ldots, \hat y_ny^?1?,…,y^?n?和對應的真實標簽y1,…,yny_1,\ldots, y_ny1?,…,yn?,對數均方根誤差的定義為
1n∑i=1n(log?(yi)?log?(y^i))2.\sqrt{\frac{1}{n}\sum_{i=1}^n\left(\log(y_i)-\log(\hat y_i)\right)^2}.n1?i=1∑n?(log(yi?)?log(y^?i?))2?.
實現K折交叉驗證:
def semilogy(x_vals, y_vals, x_label, y_label, x2_vals=None, y2_vals=None,legend=None, figsize=(3.5, 2.5)):set_figsize(figsize)plt.xlabel(x_label)plt.ylabel(y_label)plt.semilogy(x_vals, y_vals)if x2_vals and y2_vals:plt.semilogy(x2_vals, y2_vals, linestyle=':')plt.legend(legend)def get_k_fold_data(k, i, X, y):# 返回第i折交叉驗證時所需要的訓練和驗證數據assert k > 1fold_size = X.shape[0] // kX_train, y_train = None, Nonefor j in range(k):idx = slice(j * fold_size, (j + 1) * fold_size)X_part, y_part = X[idx, :], y[idx]if j == i:X_valid, y_valid = X_part, y_partelif X_train is None:X_train, y_train = X_part, y_partelse:X_train = torch.cat((X_train, X_part), dim=0)y_train = torch.cat((y_train, y_part), dim=0)return X_train, y_train, X_valid, y_validdef k_fold(k, X_train, y_train, num_epochs,learning_rate, weight_decay, batch_size):train_l_sum, valid_l_sum = 0, 0for i in range(k):data = get_k_fold_data(k, i, X_train, y_train)net = get_net(X_train.shape[1])train_ls, valid_ls = train(net, *data, num_epochs, learning_rate,weight_decay, batch_size)train_l_sum += train_ls[-1]valid_l_sum += valid_ls[-1]if i == 0:semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'rmse',range(1, num_epochs + 1), valid_ls,['train', 'valid'])print('fold %d, train rmse %f, valid rmse %f' % (i, train_ls[-1], valid_ls[-1]))return train_l_sum / k, valid_l_sum / k。
。
訓練模型:
上述代碼執行完之后會生成一個submission.csv文件,該文件符合kaggle的提交格式,可以直接將結果再kaggle比賽鏈接進行提交。
總結
以上是生活随笔為你收集整理的(pytorch-深度学习系列)简单实现kaggle房价预测-学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 干货|MIT线性代数课程精细笔记5
- 下一篇: IndexError: invalid