日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

李宏毅深度学习HW2 收入预测 (logistic regression)

發布時間:2023/12/10 pytorch 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 李宏毅深度学习HW2 收入预测 (logistic regression) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.任務內容

  • 任務:根據一個人的年齡,工作類型,教育程度等18個特征做一個二分分類——判斷其收入是否大于50k。train.csv文件打開如下:

  • 訓練集(X_train文件中):32561個人,106(擴展后,見2.1)個特征。

這里首先弄清了一個概念——回歸?:在我們認知(測量)這個世界的時候,我們并不能得到這個世界的全部信息(真值),只能得到這個世界展現出的可被我們觀測的部分信息。那么,如果我們想得到世界的真值,就只能通過盡可能多的信息,從而使得我們的認識,無限接近(回歸)真值

簡單來說,就將現有的數據向假設的模型擬合逼近。

2.實現代碼詳解

實例代碼構建了一層的神經網絡,輸出層神經元為logistic unit,使用交叉熵損失函數。

1.數據預處理

首先這個任務有個很值得考慮的問題是,如何處理那些非數字的數據。一個似乎可行的辦法是,給每類一個數字標記,如教育程度(小學,中學,大學)可以對應(1,2,3),這個方法的問題在于,會給算法暗示相鄰數字對應的種類間存在某種聯系,而實際上這種聯系是不存在的。

另一種方法是作業使用的,把一個特征擴展到多個特征,教育程度擴展成小學,中學,大學等,每個特征用(0,1)標記。經此處理后,特征便從18維度被擴展到了106維,非數的特征也變為了數字。

還有一個處理數據的思路,把fnlwgt(final analysis weights)按區間擴展到多個特征,同樣用(0,1)標記,這個操作成為離散化(Discretization)。

2.數據讀取

由于作業沒給驗證集,可以自己劃分一個。

def train_dev_split(X, y, dev_size=0.25):#按一個比例分出一部分驗證集train_len = int(round(len(X)*(1-dev_size)))return X[0:train_len], y[0:train_len], X[train_len:None], y[train_len:None]x = np.genfromtxt('X_train',delimiter=',',skip_header=1) y = np.genfromtxt('Y_train',delimiter=',',skip_header=1)

3.歸一化

常見的利用最大最小值歸一,和利用均值方差歸一。還沒太理解后者為何能歸一,希望能找一下相關數學證明。

歸一時跳過值為(0,1)的特征,可以省一點時間。(相比上個實驗用for循環,改了下邊的寫法之后...已經足夠快了)

#min max歸一 col = [0,1,3,4,5,7,10,12,25,26,27,28] xmin = np.min(x, axis = 0) xmax = np.max(x, axis = 0) x[:,col] = (x[:,col]-xmin[col])/(xmax[col] - xmin[col])#快了0.03-0.01=0.02s ''' #mean std歸一 ''' xmean = np.mean(x,axis = 0) xstd = np.std(x, axis = 0) col = [0,1,3,4,5,7,10,12,25,26,27,28] x[:,col] = (x[:,col]-xmean[col])/xstd[col] ''' x, y, X_dev, Y_dev = train_dev_split(x, y)

?4.參數設定

zeros(n)為n維數組 = zeros((n,)),只有括號里兩個參數時才生成二維數組

w = np.zeros(x.shape[1],) #106 b = np.zeros(1,) #1 lamda = 0.001 #正則化懲罰過擬合 max_iter = 40 #迭代次數 batch_size = 32 #number to feed in the model for average to avoid bias learning_rate = 0.2 num_train = len(y) num_dev = len(y_test) step =1 loss_train = [] #訓練集損失 loss_validation = [] #測試集損失 train_acc = [] #訓練集準確率 test_acc = [] #測試集準確率

5.訓練

  • 函數

怪不得編輯器自動生成的是xrange,不同的庫用的數組類型不一樣,返回的對象也不一樣。如果是py的range()就不支持np.random的shuffle方法。

log0會出現nan,exp(800)會得到inf,需要注意這種計算錯誤和處理方法。

def shuffle(X, Y):#打亂X,Yrandomize = np.arange(len(X))np.random.shuffle(randomize)return (X[randomize], Y[randomize]) #ndarray的參數是數組時,返回一個依參數排序后的數組def sigmoid(z):# Use np.clip to avoid overflow\超出的部分就把它強置為邊界部分# e是科學計數法的一種表示 aeN: a*10的N次方s = np.clip(1 / (1.0 + np.exp(-z)), 1e-6, 1-1e-6)return sdef get_prob(X, w, b):# the probability to output 1return sigmoid(np.add(np.matmul(X, w), b))def loss(y_pred, Y_label, lamda, w):#ypred不可能為1,0,所以就不用防止log0出現nan?cross_entropy = -np.dot(Y_label, np.log(y_pred))-np.dot((1-Y_label), np.log(1-y_pred))return cross_entropy + lamda * np.sum(np.square(w))def accuracy(Y_pred, Y_label):return np.sum(Y_pred == Y_label)/len(Y_pred)
  • 訓練主程序

統計數據有可能存在一些隱形的順序,比如可能沒注意的時候數據其實是先統計了男后統計了女。為避免模型學習到這些不相干因素,先得打亂數據順序。

用了mini-batch的方法,每次選一部分樣本來更新參數。

根據步數減少學習率,似乎是adagrad方法思路的簡單處理版本。

交叉熵函數的梯度函數在使用logistic時和二次代價是相同的

for epoch in range(max_iter):# Random shuffle for each epochx, y = shuffle(x, y) #打亂各行數據,這樣參數能不易陷入局部最優,模型能夠更容易達到收斂。 # Logistic regression train with batchfor idx in range(int(np.floor(len(y)/batch_size))): #每個batch更新一次x_bt = x[idx*batch_size:(idx+1)*batch_size] #32*106y_bt = y[idx*batch_size:(idx+1)*batch_size] #32*1# Find out the gradient of the lossy_bt_pred = get_prob(x_bt, w, b) #matmul:二維數組間的dotpred_error = y_bt - y_bt_predw_grad = -np.mean(np.multiply(pred_error, x_bt.T), 1)+lamda*w #multiply:數組和矩陣對應位置相乘,輸出與相乘數組/矩陣的大小一致b_grad = -np.mean(pred_error)# gradient descent update# learning rate decay with timew = w - learning_rate/np.sqrt(step) * w_gradb = b - learning_rate/np.sqrt(step) * b_gradstep = step+1# Compute the loss and the accuracy of the training set and the validation sety_pred = get_prob(x, w, b)yh = np.round(y_pred)train_acc.append(accuracy(yh, y))loss_train.append(loss(y_pred, y, lamda, w)/num_train)y_test_pred = get_prob(x_test, w, b)yh_test = np.round(y_test_pred)test_acc.append(accuracy(yh_test, y_test))loss_validation.append(loss(y_test_pred, y_test, lamda, w)/num_dev)

?6.訓練效果

在本實驗中使用均值和標準差的歸一方法訓練的模型似乎性能會比最小最大值歸一方法好很多,暫不清楚原因。

  • 使用min,max歸一

  • 使用mean,std歸一

?

總結

以上是生活随笔為你收集整理的李宏毅深度学习HW2 收入预测 (logistic regression)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。