iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

特徵工程

將原始數據轉換為更有價值和更有意義的特徵,以改善機器學習模型的性能。良好的特徵工程可以提高模型的準確性、降低過度擬合風險

特徵正規化

線性函數正規化(min-max scaling)

  • linear transfer -> [0,1]
  • X_norm = x - x_min / x_max - x_min
 import numpy as np

data = np.array([1.0, 2.0, 3.0, 4.0, 5.0])

# 最小值和最大值
x_min = data.min()
x_max = data.max()
print(x_min)
print(x_max)

NX = data - x_min
NY = x_max - x_min

print(NX)
print(NY)

# 進行線性函數正規化
normalized_data = (NX) / (NY)

print(normalized_data)

'''
1.0
5.0
[0. 1. 2. 3. 4.]
4.0
[0.   0.25 0.5  0.75 1.  ]
'''

標準化值正規化(Z-Score Normalization)

  • mean = 0
  • std = 1
  • Z = x - mean / std
import numpy as np

data = np.array([1.0, 2.0, 3.0, 4.0, 5.0])

# 計算平均值和標準差
mean = data.mean()
std = data.std()

print(mean)
print(std)

N = data - mean

# 進行標準化值正規化
normalized_data = (N) / std

print(normalized_data)

'''
3.0
1.4142135623730951
[-1.41421356 -0.70710678  0.          0.70710678  1.41421356]
'''

牛頓法

1.猜值
2.切線
y-y0/x-x0=m
=> x = x0+y-y0/m
=>(y=0)x=x0-y0/m
=>(m=f’(x))x=x0-y0/f’(x)

import numpy as np

def newton_method(f, f_prime, x0=None, tol=1e-6, max_iter=100):
    """
    牛頓法求解函數的根
    
    Parameters:
        - f: 要求解根的函數
        - f_prime: 函數的一階導數
        - x0: 初始猜測值(可選),如果未提供,將使用隨機初始值
        - tol: 容忍誤差,當函數值小於tol時停止迭代
        - max_iter: 最大迭代次數
        
    Returns:
        - root: 求解得到的根
    """
    if x0 is None:
        x0 = np.random.rand()  # 使用隨機初始值
    x = x0
    for _ in range(max_iter):
        fx = f(x)
        fpx = f_prime(x)
        if abs(fx) < tol:
            return x
        x = x - fx / fpx
    return x

# 定義要求解根的函數及其一階導數
def function(x):
    return x**3 - 2*x - 5

def derivative(x):
    return 3*x**2 - 2

# 使用牛頓法求解根,可以自由輸入初始猜測值
initial_guess = float(input("請輸入初始猜值: "))
root = newton_method(function, derivative, initial_guess)
print("牛頓法求解的根:", root)

隨機梯度下降(Stochastic Gradient Descent, SGD)

  1. 隨機選擇一個訓練樣本。
  2. 計算該樣本的梯度。
  3. 使用梯度的方向和學習率來更新模型的參數。
  4. 重複步驟1-3,直到達到停止條件(例如,達到一個固定的迭代次數或梯度的變化很小)。
import numpy as np

# 定義損失函數(這裡使用一個簡單的二次函數)
def loss_function(x):
    return x**2 + 2*x + 1

# 定義損失函數的梯度
def gradient(x):
    return 2*x + 2

# 初始化參數
learning_rate = 0.1
num_iterations = 100

# 使用者輸入初始參數值
x = float(input("請輸入初始參數值: "))

# 使用SGD更新參數
for _ in range(num_iterations):
    gradient_x = gradient(x)
    x = x - learning_rate * gradient_x

# 輸出最終估計的參數值
print("SGD估計的參數值:", x)

高維組合特徵處理

高維度常見問題

  • 維度災難(Curse of Dimensionality)

降維

  • 特徵篩選(Feature Selection)
  • 徵提取(Feature Extraction)
  • 特徵組合(Feature Engineering)
  • 正則化(Regularization)
  • 特徵選擇模型和工具
import pandas as pd
from sklearn.preprocessing import PolynomialFeatures

data = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

# 創建多項式特徵,例如 A^2, AB, B^2
poly = PolynomialFeatures(degree=2, include_bias=False)
result = poly.fit_transform(data)

print(result)

'''
[[ 1.  4.  1.  4. 16.]
[ 2.  5.  4. 10. 25.]
[ 3.  6.  9. 18. 36.]]
'''

上一篇
[DAY13] 機器學習基本架構(一): 資料前處理
下一篇
[DAY15] 機器學習基本架構(二): 特徵工程Part2
系列文
關於我從基礎程設轉職到人工智慧入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言