
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
其中, 和 分別是數據集 中的最小值和最大值。經過這個公式處理后, 的值將位于0和1之間。
計算步驟
以下代碼包括數據生成、歸一化處理,以及可視化對比結果。
import numpy as np
import matplotlib.pyplot as plt
# 生成兩組不同尺度的數據
data_small_scale = np.random.randint(0, 100, 100) # 范圍在0到100
data_large_scale = np.random.randint(1000, 10000, 100) # 范圍在1000到10000
# 最小-最大歸一化
def min_max_normalize(data):
return (data - np.min(data)) / (np.max(data) - np.min(data))
# 應用最小-最大歸一化
normalized_small_scale = min_max_normalize(data_small_scale)
normalized_large_scale = min_max_normalize(data_large_scale)
# 可視化對比
plt.figure(figsize=(12, 6))
# 繪制原始數據的直方圖
plt.subplot(221)
plt.hist(data_small_scale, bins=15, color='blue', alpha=0.7)
plt.title('Small Scale Data')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.subplot(222)
plt.hist(data_large_scale, bins=15, color='red', alpha=0.7)
plt.title('Large Scale Data')
plt.xlabel('Value')
plt.ylabel('Frequency')
# 繪制歸一化數據的直方圖
plt.subplot(223)
plt.hist(normalized_small_scale, bins=15, color='green', alpha=0.7)
plt.title('Normalized Small Scale Data')
plt.xlabel('Normalized Value')
plt.ylabel('Frequency')
plt.subplot(224)
plt.hist(normalized_large_scale, bins=15, color='orange', alpha=0.7)
plt.title('Normalized Large Scale Data')
plt.xlabel('Normalized Value')
plt.ylabel('Frequency')
plt.tight_layout()
plt.show()
在這段代碼中,定義了一個 min_max_normalize
函數來應用最小-最大歸一化。
要清楚地展示歸一化前后數據的差異,我們可以采取以下兩種方法:
我將按照第一種方法進行操作,生成兩組數據:一組范圍在0到100,另一組范圍在1000到10000。然后,我們將應用最小-最大歸一化并比較結果。
在這個圖中,我們展示了兩組不同尺度的數據及其歸一化后的結果。
這兩組數據在尺度上有顯著差異,這在現實世界的數據集中是常見的情況。接下來,我們看到歸一化后的結果:
通過這種比較,可以清楚地看到歸一化處理對于不同尺度數據的影響。無論原始數據的尺度多大,歸一化都能將其有效地轉換到相同的尺度上,這對于確保機器學習模型的性能和穩定性至關重要。特別是在涉及多個特征,且這些特征具有不同尺度的情況下,歸一化可以幫助模型更有效地學習和理解數據。
下面幾種歸一化方法,咱們結合具體的算法模型來說說~
標準化(Standardization)將數據調整為具有均值為0和標準差為1的分布。這種處理對于許多機器學習算法是重要的,因為它們假設所有特征都是以同樣的規模(比如,高斯分布)測量的。
對于數據集??中的每個特征?,標準化可以表示為:
其中, 是特征的平均值, 是標準差。這個轉換保證了特征 的均值為0,標準差為1。
計算步驟
案例代碼
這個例子中,我們使用支持向量機(SVM)作為算法模型,展示標準化對模型性能的影響。
使用Python的scikit-learn
庫來實現這一點,并使用make_classification
來生成虛擬的分類數據集。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_classification
from sklearn.metrics import accuracy_score
# 生成虛擬數據集
X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0, n_clusters_per_class=1, random_state=42)
# 劃分數據集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 未標準化的SVM模型
model = SVC(kernel='linear')
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
accuracy_non_standardized = accuracy_score(y_test, y_pred)
# 應用標準化
scaler = StandardScaler()
X_train_standardized = scaler.fit_transform(X_train)
X_test_standardized = scaler.transform(X_test)
# 標準化的SVM模型
model_standardized = SVC(kernel='linear')
model_standardized.fit(X_train_standardized, y_train)
y_pred_standardized = model_standardized.predict(X_test_standardized)
accuracy_standardized = accuracy_score(y_test, y_pred_standardized)
# 結果展示
print(f'Accuracy with non-standardized data: {accuracy_non_standardized}')
print(f'Accuracy with standardized data: {accuracy_standardized}')
# 可視化
plt.figure(figsize=(12, 5))
# 繪制未標準化數據
plt.subplot(1, 2, 1)
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train)
plt.title("Distribution of Non-Standardized Data")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
# 繪制標準化數據
plt.subplot(1, 2, 2)
plt.scatter(X_train_standardized[:, 0], X_train_standardized[:, 1], c=y_train)
plt.title("Distribution of Standardized Data")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
在這段代碼中,我們首先生成一個虛擬的二維分類數據集。然后,我們訓練了兩個SVM模型,一個使用未標準化數據,另一個使用標準化數據。
通過比較這兩個模型的準確率,我們可以看到標準化對模型性能的影響。
歸一化與標準化的對比效果
有機會的話,大家在后面的學習中,可以通過實際的模型和數據集,更加具體展示標準化和歸一化對模型性能的不同影響,例如通過準確率、均方誤差等指標來量化這些影響。另外,在實際應用中,選擇哪種預處理方法取決于數據的特性和所使用的模型。
小數定標歸一化 在機器學習中常用來調整特征值的比例,使其落在一個較小的特定范圍(通常是-1到1或者0到1)。該方法通過移動數據的小數點來實現歸一化。小數點的移動位數依賴于屬性值的最大絕對值。
該方法的核心是將數據縮放至其絕對值最大的那個數變為不大于1的數。例如,如果一個屬性值的最大絕對值是123,則小數點需要移動三位,即每個值都除以1000。
公式推導
歸一化公式為:
其中,?是原始數據,?是歸一化后的數據,?是根據最大絕對值確定的小數點移動位數,計算方法為:
這里, 表示向上取整, 表示以10為底的對數。
計算步驟
案例代碼
結合線性回歸模型來演示小數定標歸一化的效果。
代碼中我們使用一個虛擬數據集來進行演示,并比較歸一化前后的模型性能。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 生成虛擬數據集
np.random.seed(0)
X = np.random.rand(100, 1) * 100 # 隨機生成0-100之間的數
y = 3 * X.squeeze() + 4 + np.random.randn(100) # 線性關系加上噪聲
# 定義小數定標歸一化函數
def decimal_scaling_normalization(data):
k = np.ceil(np.log10(np.max(np.abs(data))))
return data / (10 ** k)
# 應用歸一化
X_normalized = decimal_scaling_normalization(X)
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
X_train_norm, X_test_norm = train_test_split(X_normalized, test_size=0.2, random_state=0)
# 訓練模型
model = LinearRegression()
model.fit(X_train, y_train)
model_norm = LinearRegression()
model_norm.fit(X_train_norm, y_train)
# 預測和評估
y_pred = model.predict(X_test)
y_pred_norm = model_norm.predict(X_test_norm)
mse_original = mean_squared_error(y_test, y_pred)
mse_normalized = mean_squared_error(y_test, y_pred_norm)
# 結果可視化
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.scatter(X_test, y_test, color='blue')
plt.plot(X_test, y_pred, color='red')
plt.title(f"Original Data (MSE: {mse_original:.2f})")
plt.subplot(1, 2, 2)
plt.scatter(X_test_norm, y_test, color='green')
plt.plot(X_test_norm, y_pred_norm, color='red')
plt.title(f"Normalized Data (MSE: {mse_normalized:.2f})")
plt.show()
結果比較
上述代碼中,我們首先生成了一個簡單的線性關系數據集。然后,我們對這個數據集應用了小數定標歸一化,并使用線性回歸模型在歸一化前后的數據上進行了訓練和測試。
通過比較歸一化前后的均方誤差(MSE),我們可以看到歸一化是否提升了模型的性能。同時,通過繪圖,我們可以直觀地看到歸一化對模型預測結果的影響。通常,歸一化會使模型訓練更加穩定和快速,特別是在特征值范圍差異較大的情況下。
均值歸一化是一種常用的數據預處理方法,用于機器學習中的特征縮放。它的目的是調整特征數據的規模,使其在一個統一的范圍內,通常是[-1, 1]。這樣做可以加快學習算法的收斂速度,并提高算法的性能。
公式推導
均值歸一化的公式可以表示為:
其中, 是歸一化后的值, 是原始數據, 是原始數據的均值, 是原始數據的標準差。
計算步驟
案例代碼
結合KNN,在算法中應用均值歸一化。同時使用一個虛擬數據集來演示這一過程,并且比較歸一化前后的效果。
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 生成虛擬數據集
np.random.seed(0)
X = np.random.rand(1000, 2) # 1000個樣本,每個樣本2個特征
y = np.random.randint(0, 2, 1000) # 生成0和1的標簽
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 不使用歸一化
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
predictions = knn.predict(X_test)
accuracy_without_normalization = accuracy_score(y_test, predictions)
# 使用均值歸一化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
knn.fit(X_train_scaled, y_train)
predictions = knn.predict(X_test_scaled)
accuracy_with_normalization = accuracy_score(y_test, predictions)
# 可視化比較結果
plt.bar(['Without Normalization', 'With Normalization'], [accuracy_without_normalization, accuracy_with_normalization])
plt.ylabel('Accuracy')
plt.title('Comparison of KNN Accuracy with and without Mean Normalization')
plt.show()
使用KNN算法分別在未歸一化的數據和經過均值歸一化的數據上進行訓練和測試,并比較了兩種情況下的準確率。
歸一化前后的對比效果
最后,通過繪制的柱狀圖可以直觀地比較歸一化前后KNN算法的準確率,從而驗證均值歸一化對模型性能的影響。
單位長度歸一化是一種常見的數據預處理技術,用于機器學習中的特征縮放。其目的是調整數據集中特征的尺度,使每個特征的值都按其長度進行縮放,從而具有單位長度。
算法原理
單位長度歸一化的基本原理是將每個特征向量調整為單位長度。這通常通過將每個特征向量除以其歐幾里得范數(即向量的長度)來實現。
公式推導
考慮一個特征向量?,其單位長度歸一化的向量為?,其中:
其中,?是??的歐幾里得范數,計算為:
因此,歸一化后的每個元素??為:
計算步驟
案例代碼
結合線性回歸,并使用虛擬數據集進行代碼的編寫。
為了更豐富地展示單位長度歸一化對模型性能的影響,我們可以增加一些額外的可視化,例如展示預測誤差的分布和特征值的分布對比。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 創建虛擬數據集
np.random.seed(0)
X = np.random.rand(100, 3) # 100個樣本,3個特征
y = X @ np.array([1.5, -2.0, 1.0]) + np.random.randn(100) * 0.5 # 目標變量
# 單位長度歸一化
norm_X = X / np.linalg.norm(X, axis=1, keepdims=True)
# 分割數據集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
norm_X_train, norm_X_test = train_test_split(norm_X, test_size=0.2, random_state=42)
# 訓練模型
model = LinearRegression()
model.fit(X_train, y_train)
norm_model = LinearRegression()
norm_model.fit(norm_X_train, y_train)
# 預測和評估
y_pred = model.predict(X_test)
norm_y_pred = norm_model.predict(norm_X_test)
mse = mean_squared_error(y_test, y_pred)
norm_mse = mean_squared_error(y_test, norm_y_pred)
# 結果比較
print("MSE without normalization:", mse)
print("MSE with unit length normalization:", norm_mse)
# 繪制結果
plt.figure(figsize=(18, 6))
# 預測值與實際值對比
plt.subplot(1, 3, 1)
plt.scatter(y_test, y_pred, label='Without Normalization')
plt.scatter(y_test, norm_y_pred, color='r', label='With Normalization')
plt.title("Predictions vs True Values")
plt.xlabel("True Values")
plt.ylabel("Predictions")
plt.legend()
# 預測誤差分布
plt.subplot(1, 3, 2)
plt.hist(y_test - y_pred, bins=15, alpha=0.7, label='Without Normalization')
plt.hist(y_test - norm_y_pred, bins=15, alpha=0.7, color='r', label='With Normalization')
plt.title("Prediction Error Distribution")
plt.xlabel("Prediction Error")
plt.ylabel("Frequency")
plt.legend()
# 特征分布對比
plt.subplot(1, 3, 3)
for i in range(X.shape[1]):
plt.hist(X[:, i], bins=15, alpha=0.5, label=f'Feature {i+1} Original')
plt.hist(norm_X[:, i], bins=15, alpha=0.5, color='r', label=f'Feature {i+1} Normalized')
plt.title("Feature Distributions")
plt.xlabel("Feature Value")
plt.ylabel("Frequency")
plt.legend()
plt.tight_layout()
plt.show()
上述代碼將創建三個圖表:
這些圖表提供了更全面的視角來觀察數據預處理對模型性能的影響。
本文章轉載微信公眾號@深夜努力寫Python