
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
我們將使用Kaggle中的「汽車燃油效率」數據集(或類似的數據集),從頭實現SVR的訓練過程,并進行數據可視化分析。
1. 加載數據集
2. 數據預處理
3. 定義SVR的訓練過程
4. 可視化分析
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 加載數據
data = pd.read_csv('auto-mpg.csv')
# 數據預處理
data = data[['mpg', 'horsepower', 'weight', 'acceleration']]
data = data.dropna() # 刪除缺失值
# 將'horsepower'列轉換為數值型,并處理無效數據
data['horsepower'] = pd.to_numeric(data['horsepower'], errors='coerce')
data = data.dropna() # 處理轉換后可能出現的缺失值
X = data[['horsepower', 'weight', 'acceleration']].values
y = data['mpg'].values
# 標準化輸入數據
X = (X - X.mean(axis=0)) / X.std(axis=0)
y = (y - y.mean()) / y.std()
為了簡單,我們實現一個線性SVR,不使用現有的庫來直接調用SVR算法。
class SVR:
def __init__(self, C=1.0, epsilon=0.1, lr=0.001, max_iter=1000):
self.C = C
self.epsilon = epsilon
self.lr = lr
self.max_iter = max_iter
def fit(self, X, y):
n_samples, n_features = X.shape
self.w = np.zeros(n_features)
self.b = 0
for _ in range(self.max_iter):
for i in range(n_samples):
if np.abs(y[i] - (np.dot(X[i], self.w) + self.b)) > self.epsilon:
if y[i] > np.dot(X[i], self.w) + self.b:
self.w += self.lr * (X[i] - self.C * self.w)
self.b += self.lr * 1
else:
self.w -= self.lr * (X[i] + self.C * self.w)
self.b -= self.lr * 1
def predict(self, X):
return np.dot(X, self.w) + self.b
# 訓練SVR模型
model = SVR(C=1.0, epsilon=0.1, lr=0.001, max_iter=10000)
model.fit(X, y)
# 預測
y_pred = model.predict(X)
我們將通過以下四個圖表來分析數據和模型表現:
1. 原始數據的分布
2. 訓練后的回歸線與實際數據的對比
3. 殘差分布
4. 預測值與實際值的對比
# 1. 原始數據的分布
plt.figure(figsize=(8,6))
plt.scatter(X[:,0], y, color='blue', label='Actual')
plt.title('Original Data Distribution')
plt.xlabel('Horsepower')
plt.ylabel('MPG')
plt.legend()
plt.show()
# 2. 回歸線與實際數據對比
plt.figure(figsize=(8,6))
plt.scatter(X[:,0], y, color='blue', label='Actual')
plt.plot(X[:,0], y_pred, color='red', label='Predicted')
plt.title('SVR Fit')
plt.xlabel('Horsepower')
plt.ylabel('MPG')
plt.legend()
plt.show()
# 3. 殘差分布
residuals = y - y_pred
plt.figure(figsize=(8,6))
plt.hist(residuals, bins=20, color='green')
plt.title('Residuals Distribution')
plt.xlabel('Residuals')
plt.ylabel('Frequency')
plt.show()
# 4. 預測值與實際值的對比
plt.figure(figsize=(8,6))
plt.scatter(y, y_pred, color='purple')
plt.title('Predicted vs Actual MPG')
plt.xlabel('Actual MPG')
plt.ylabel('Predicted MPG')
plt.show()
這個案例中,我們手動實現了一個簡單的SVR模型,并且通過四個圖形分析了模型的表現:
1. 原始數據分布 展示了我們正在處理的數據的基本特征。
2. 回歸線與實際數據對比 展示了SVR模型的擬合效果。
3. 殘差分布 讓我們直觀了解模型誤差的分布情況。
4. 預測值與實際值的對比 幫助我們評估模型的預測效果。
上面的代碼手動實現了 SVR,通過圖形進行數據分析。在這個過程中,希望幫助大家深入理解了SVR的數學原理,并通過手動實現掌握了它的內在工作邏輯。