【小白学习PyTorch教程】七、基于乳腺癌数据集构建Logistic 二分类模型
「@Author:Runsen」
在邏輯回歸中預測的目標變量不是連續的,而是離散的。可以應用邏輯回歸的一個示例是電子郵件分類:標識為垃圾郵件或非垃圾郵件。圖片分類、文字分類都屬于這一類。
在這篇博客中,將學習如何在 PyTorch 中實現邏輯回歸。
1. 數據集加載
在這里,我將使用來自 sklearn 庫的乳腺癌數據集。這是一個簡單的二元類分類數據集。從 sklearn.datasets 模塊加載。接下來,可以使用內置函數從數據集中提取 X 和 Y,代碼如下所示。
from?sklearn?import?datasets breast_cancer=datasets.load_breast_cancer() x,y=breast_cancer.data,breast_cancer.target from?sklearn.model_selection?import?train_test_split x_train,x_test,y_train,y_test=?train_test_split(x,y,test_size=0.2)在上面的代碼中,測試大小表示要用作測試數據集的數據的比例。因此,80% 用于訓練,20% 用于測試。
2. 預處理
由于這是一個分類問題,一個好的預處理步驟是應用標準的縮放器變換。
scaler=sklearn.preprocessing.StandardScaler() x_train=scaler.fit_transform(x_train) x_test=scaler.fit_transform(x_test)現在,在使用Logistic 模型之前,還有最后一個關鍵的數據處理步驟。在Pytorch 需要使用張量。因此,我們使用“torch.from_numpy()”方法將所有四個數據轉換為張量。
在此之前將數據類型轉換為 float32很重要。可以使用“astype()”函數來做到這一點。
import?numpy?as?np import?torch x_train=torch.from_numpy(x_train.astype(np.float32)) x_test=torch.from_numpy(x_test.astype(np.float32)) y_train=torch.from_numpy(y_train.astype(np.float32)) y_test=torch.from_numpy(y_test.astype(np.float32))我們知道 y 必須采用列張量而不是行張量的形式。因此,使用代碼中所示的view操作執行此更改。對 y_test 也做同樣的操作。
y_train=y_train.view(y_train.shape[0],1) y_test=y_test.view(y_test.shape[0],1)預處理步驟完成,您可以繼續進行模型構建。
3. 模型搭建
現在,我們已準備好輸入數據。讓我們看看如何在 PyTorch 中編寫用于邏輯回歸的自定義模型。第一步是用模型名稱定義一個類。這個類應該派生torch.nn.Module。
在類內部,我們有__init__ 函數和 forward函數。
class?Logistic_Reg_model(torch.nn.Module):def?__init__(self,no_input_features):super(Logistic_Reg_model,self).__init__()self.layer1=torch.nn.Linear(no_input_features,20)self.layer2=torch.nn.Linear(20,1)def?forward(self,x):y_predicted=self.layer1(x)y_predicted=torch.sigmoid(self.layer2(y_predicted))return?y_predicted在__init__方法中,必須在模型中定義所需的層。在這里,使用線性層,可以從 torch.nn 模塊聲明。需要為圖層指定任何名稱,例如本例中的“layer1”。所以,我已經聲明了 2 個線性層。
語法為:torch.nn.Linear(in_features, out_features, bias=True)接下來,也要有“forward()”函數,負責執行前向傳遞/傳播。輸入通過之前定義的 2 個層。此外,第二層的輸出通過一個稱為 sigmoid的激活函數。
激活函數用于捕捉線性數據中的復雜關系。在這種情況下,我們使用 sigmoid 激活函數。
在這種情況下,我們選擇 sigmoid 函數的原因是它會將值限制為(0 到 1)。下面是 sigmoid 函數的圖形及其公式
4. 訓練和優化
定義類后,初始化模型。
model=Logistic_Reg_model(n_features)現在,需要定義損失函數和優化算法。在 Pytorch 中,可以通過簡單的步驟選擇并導入所需的損失函數和優化算法。在這里,選擇 BCE 作為我們的損失標準。
BCE代表二元交叉熵損失。它通常用于二元分類示例。值得注意的一點是,當使用 BCE 損失函數時,節點的輸出應該在(0-1)之間。我們需要為此使用適當的激活函數。
對于優化器,選擇 SGD 或隨機梯度下降。SGD 算法,通常用作優化器。還有其他優化器,如 Adam、lars 等。
優化算法有一個稱為學習率的參數。這基本上決定了算法接近局部最小值的速率,此時損失最小。這個值很關鍵。
因為如果學習率值太高,算法可能會突然出現并錯過局部最小值。如果它太小,則會花費大量時間并且可能無法收斂。因此,學習率“lr”是一個超參數,應該微調到最佳值。
criterion=torch.nn.BCELoss() optimizer=torch.optim.SGD(model.parameters(),lr=0.01)接下來,決定 epoch 的數量,然后編寫訓練循環。
number_of_epochs=100 for?epoch?in?range(number_of_epochs):y_prediction=model(x_train)loss=criterion(y_prediction,y_train)loss.backward()optimizer.step()optimizer.zero_grad()if?(epoch+1)%10?==?0:print('epoch:',?epoch+1,',loss=',loss.item())如果發生了第一次前向傳播。接下來,計算損失。當loss.backward()被調用時,它計算損失相對于(層的)權重的梯度。然后通過調用optimizer.step()更新權重。之后,必須為下一次迭代清空權重。因此調用 zero_grad()方法。
計算準確度
with?torch.no_grad():y_pred=model(x_test)y_pred_class=y_pred.round()accuracy=(y_pred_class.eq(y_test).sum())/float(y_test.shape[0])print(accuracy.item())#?0.92105?使用torch.no_grad(),目的是基跳過權重的梯度計算。所以,我在這個循環中寫的任何內容都不會導致權重發生變化,因此不會干擾反向傳播過程。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯黃海廣老師《機器學習課程》課件合集 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【小白学习PyTorch教程】七、基于乳腺癌数据集构建Logistic 二分类模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springMVC实体用注解管理,多对多
- 下一篇: 【机器学习】漫谈特征缩放