二手車交易預測模型筆記

无语了666發表於2024-07-29

一、梯度下降法
梯度下降法就是一種透過求目標函式的導數來尋找目標函式最小化的方法。梯度下降目的是找到目標函式最小化時的取值所對應的自變數的值,目的是為了找自變數X。
梯度:是一個向量,其方向上的方向導數最大(意味著在這個方向上,函式的值增加最快。從圖形上看,就是函式圖形在某點最“陡峭”的方向)。其大小正好是此點的最大方向導數。
梯度下降演算法用下山來類比就是,以他當前的所處的位置為基準,尋找這個位置最陡峭的地方,然後朝著山的高度下降的方向走,然後每走一段距離,都反覆採用同一個方法,最後就能成功的抵達山谷。
學習率決定了模型在每一次迭代中沿著梯度下降(或上升,對於最大化問題)方向更新引數的幅度。
學習率的重要性:
過大:如果學習率設定得太大,模型在訓練過程中可能會跳過最優解,導致訓練過程中的損失值在最優解附近波動,甚至發散,無法收斂。
過小:如果學習率設定得太小,雖然模型最終能夠收斂到最優解附近,但訓練過程會非常緩慢,需要更多的迭代次數,增加了計算成本和時間成本。
適中:選擇合適的學習率可以讓模型在合理的時間內快速且穩定地收斂到最優解附近。

二、特徵縮放(歸一化):提升模型精度(消除不同量綱)
例如:
假設用神經網路來學習這份資料,那麼就會導致取值範圍更大的薪水會主導模型的訓練,也就是模型會偏向於薪水,但通常我們不希望我們的演算法一開始就偏向於某個特徵,因此要對資料做歸一化處理。
下面是課程中出現的兩種歸一化操作
歸一化處理方法一:
歸一化處理方法二: data[col] = (data[col]-data[col].min()) /、(data[col].max()-data[col].min())
三、Relu啟用函式:將所有的負值置為0,而正值保持不變,從而引入非線性因素,模擬複雜的神經網路。

四、損失函式(Mseloss)

五、onehot編碼處理(將分類變數轉換為機器學習演算法可以處理的數值形式)
定義One-Hot編碼函式
def oneHotEncode(df, colNames):

1. df: 一個pandas DataFrame,包含要進行One-Hot編碼的列。

2. colNames: 一個列表,包含要進行One-Hot編碼的列名。

for col in colNames:
    dummies = pd.get_dummies(df[col], prefix=col)

使用pandas的get_dummies函式對指定列進行One-Hot編碼。這裡,prefix引數用於為生成的虛擬列新增字首,以便更容易地識別它們來自哪個原始列。

df = pd.concat([df, dummies],axis=1)

使用pandas的concat函式將原始DataFrame和編碼後的虛擬列(dummies)沿著列方向(axis=1)連線起來。這會在原始DataFrame的右側新增新的虛擬列。

df.drop([col], axis=1, inplace=True)

從原始DataFrame中刪除已經進行One-Hot編碼的原始列。(inplace=True參數列示直接在原始DataFrame上進行修改,而不是返回一個新的DataFrame。)

return df

當所有指定列都經過One-Hot編碼並刪除原始列後,函式返回修改後的DataFrame。

六、課程中出現的一些資料處理操作
1、替換特定字元:
data = data.replace('-', '-1')
這行程式碼在data DataFrame中全域性搜尋所有的'-'字元,並將它們替換為字串'-1'。注意,這裡的替換是全域性的,它會檢查DataFrame中的所有元素(即所有列和行中的每個單元格),並將找到的'-'替換為'-1'。這種替換預設不會改變資料的型別,即如果原資料是數值型別,替換後的結果仍然是字串型別。
2、更改資料型別:
data.notRepairedDamage = data.notRepairedDamage.astype('float32')
這行程式碼將data DataFrame中notRepairedDamage列的資料型別轉換為float32。這通常用於確保列中的資料是以浮點數形式處理的,這對於數值計算和機器學習模型訓練特別有用。
3、基於條件更新資料:
data.loc[data['power']>600,'power'] = 600
這行程式碼使用loc方法基於條件更新data DataFrame中的power列。具體來說,它查詢power列中大於600的所有值,並將這些值設定為600。這是一種常見的資料預處理步驟,用於處理異常值或限制某些特徵的範圍,以便更好地進行後續的資料分析或機器學習模型訓練。
4、填充空缺值
data[col] = data[col].fillna('-1')
對於config['cate_cols']中指定的所有分類特徵列,使用字串'-1'來填充缺失值。
5、處理無關資料
data.drop(['name', 'regionCode'], axis=1, inplace=True)
從資料集中移除了name和regionCode列
del test_data['price'] 刪除‘price’列
6、篩選或隱藏資料
test_data = data[pd.isna(data.price)] 從 data DataFrame 中篩選出那些 price 列包含缺失值(即 NaN)的行,並將這些行儲存到新的 DataFrame test_data 中。
train_data = train_data.drop(data[pd.isna(data.price)].index) 隱藏price 列中含有缺失值(NaN)的行
7、打亂資料順序(使隨機化)
train_data.sample(frac=1)這行程式碼就是用於隨機化train_data DataFrame中的行順序,以確保模型訓練的公平性和泛化能力。
8、初始化
初始化函式 init
在Python中,特別是在使用物件導向程式設計(OOP)時,init 函式是一個特殊的方法,被稱為類的建構函式或初始化方法。當建立類的新例項時,Python 會自動呼叫這個方法。init 方法的主要目的是初始化新建立的物件的狀態或屬性。在PyTorch的nn.Module子類中定義網路結構時,init 方法用於定義網路層的結構,即哪些層將被包含在網路中,以及這些層的配置(如輸入和輸出維度)。
9、前向傳播函式 forward
def forward(self, x): 定義了資料透過網路的前向傳播過程。x是輸入資料。
y = self.layers(x): 將輸入資料x傳遞給self.layers(即前面定義的層序列),執行前向傳播,並將結果儲存在y中。這裡的y是網路的最終輸出。
return y: 返回網路的輸出y。
七、tensor類
X=torch.tensor(train_data.values, dtype=torch.float32)
這行程式碼是使用PyTorch庫來將一個名為train_data的資料集(可能是一個pandas DataFrame或者類似的二維資料結構)轉換為PyTorch張量(Tensor)。這裡,train_data.values獲取了train_data中的值,通常是一個NumPy陣列,然後這個陣列被轉換成了一個PyTorch張量,並且指定了資料型別為torch.float32。
補充:item()函式將pytorch張量轉化成Python標量
X = X.reshape(-1, 334) 這行程式碼是在對已經存在的PyTorch張量 X 進行重塑(reshape)操作。這裡,X 是一個多維張量,而 reshape 方法被用來改變其形狀,但不改變其資料。
具體來說,reshape(-1, 334) 的含義是:
-1:這個維度的大小是自動計算的,以便保持張量中元素的總數不變。這裡,PyTorch會計算需要多少行(第一個維度)來確保總的元素數量與原始張量相同,同時保持第二個維度為334。
334:這是重塑後張量的第二個維度的大小,即每行將包含334個元素。
這種重塑操作在準備資料以輸入到神經網路中時非常常見。例如,如果你有一個包含多個樣本的資料集,每個樣本都有334個特徵,但原始資料的形狀可能不是 (n_samples, 334),你就可能需要使用 reshape 方法來將其轉換為這種形狀。

1、Tensor的基本概念
Tensor是一個多維陣列,可以表示標量、向量、矩陣以及更高維度的陣列。在深度學習中,Tensor是資料的基本單位,用於儲存和傳輸資料。Tensor的維度(也稱為秩)決定了其結構,例如:
Rank為0的Tensor是標量(Scalar),表示一個單一的數值。
Rank為1的Tensor是向量(Vector),表示一維陣列。
Rank為2的Tensor是矩陣(Matrix),表示二維陣列。
Rank大於2的Tensor稱為高維張量,可以表示更復雜的資料結構。
2、Tensor的屬性
Tensor具有多個屬性,這些屬性描述了Tensor的基本特徵,包括:
資料型別(dtype):Tensor中元素的資料型別,如float32、int64等。
形狀(shape):Tensor的維度資訊,用元組表示,例如(2, 3)表示一個2行3列的二維Tensor。
裝置(device):Tensor儲存的裝置,可以是CPU或GPU,用於指定Tensor的計算位置。
梯度(grad)(在PyTorch中):如果Tensor的requires_grad屬性被設定為True,則PyTorch會跟蹤與該Tensor相關的所有計算,並在呼叫.backward()時計算其梯度。
3、Tensor的建立與操作
在PyTorch和TensorFlow中,可以透過多種方式建立Tensor,例如:
一)直接建立:使用框架提供的函式,如PyTorch中的torch.tensor()、torch.zeros()、torch.ones()等,或TensorFlow中的tf.constant()、tf.zeros()、tf.ones()等。
二)從其他資料型別轉換:可以從Python的內建資料型別(如列表、元組)或NumPy陣列轉換而來。
Tensor支援多種操作,包括基本的數學運算(如加減乘除)、矩陣運算(如矩陣乘法)、廣播(Broadcasting)等。這些操作使得Tensor能夠靈活地表示和處理複雜的資料結構和計算任務。
4、Tensor的應用
在深度學習中,Tensor被廣泛應用於神經網路的構建和訓練過程中。神經網路的每一層都涉及到Tensor的輸入、輸出和計算。透過前向傳播(Forward Pass),資料以Tensor的形式在神經網路中流動,併產生最終的輸出。然後,透過反向傳播(Backward Pass)和梯度下降等最佳化演算法,計算並更新網路中的引數(以Tensor的形式表示),以最小化損失函式並提高模型的效能。

相關文章