Python 中快速上手機器學習的七個基礎算法
機器學習作為一種讓計算機從數據中自動學習的技術,在近年來得到了迅猛發展。本文將介紹幾種基礎的機器學習算法,并通過Python代碼示例展示它們的應用。
1. 什么是機器學習
機器學習是一種讓計算機學會從數據中自動“學習”并做出預測或決策的技術。不需要顯式地編程告訴計算機如何執行任務。機器學習的核心在于構建模型,通過大量數據訓練模型,使其能夠準確預測未知數據的結果。
2. 為什么選擇Python
Python語言簡單易學,擁有強大的科學計算庫,如NumPy、Pandas、Scikit-learn等。這些庫提供了大量的函數和工具,可以方便地處理數據、訓練模型、評估性能。
3. 線性回歸
線性回歸是最簡單的機器學習算法之一。它假設因變量y與自變量x之間存在線性關系,即y = ax + b。線性回歸的目標是找到最佳擬合直線,使得所有點到直線的距離平方和最小。
代碼示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 創建數據集
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創建線性回歸模型
model = LinearRegression()
# 訓練模型
model.fit(X_train, y_train)
# 預測
y_pred = model.predict(X_test)
# 可視化
plt.scatter(X_test, y_test, color='blue', label='Actual')
plt.plot(X_test, y_pred, color='red', linewidth=2, label='Predicted')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.show()
# 輸出系數和截距
print("Coefficient:", model.coef_)
print("Intercept:", model.intercept_)
輸出結果:運行上述代碼后,會生成一張散點圖,其中藍色點表示真實值,紅色線表示預測值。同時控制臺會輸出模型的系數和截距。
4. 邏輯回歸
邏輯回歸主要用于解決二分類問題。它通過Sigmoid函數將線性組合映射到[0,1]區間內,代表事件發生的概率。邏輯回歸的目標是最大化似然函數,即找到一組參數使得訓練樣本出現的概率最大。
代碼示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 創建數據集
X, y = make_classification(n_samples=100, n_features=2, n_redundant=0, n_informative=2,
random_state=1, n_clusters_per_class=1)
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創建邏輯回歸模型
model = LogisticRegression()
# 訓練模型
model.fit(X_train, y_train)
# 預測
y_pred = model.predict(X_test)
# 可視化
def plot_decision_boundary(model, axis):
x0, x1 = np.meshgrid(
np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),
np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),
)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_predict = model.predict(X_new)
zz = y_predict.reshape(x0.shape)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
plot_decision_boundary(model, axis=[-3, 3, -3, 3])
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.show()
# 輸出準確率
from sklearn.metrics import accuracy_score
print("Accuracy:", accuracy_score(y_test, y_pred))
輸出結果:運行上述代碼后,會生成一張決策邊界圖,展示了邏輯回歸模型如何區分兩類樣本。同時控制臺會輸出模型在測試集上的準確率。
5. 決策樹
決策樹是一種樹形結構的分類和回歸算法。它通過遞歸地劃分數據集,構建一棵樹形結構,最終實現分類或回歸。每個內部節點表示一個屬性上的測試,每個分支表示一個測試結果,每個葉節點表示一個類別或數值。
代碼示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.tree import plot_tree
# 加載數據集
data = load_iris()
X = data.data[:, :2] # 只使用前兩個特征
y = data.target
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創建決策樹模型
model = DecisionTreeClassifier(max_depth=3)
# 訓練模型
model.fit(X_train, y_train)
# 可視化決策樹
plt.figure(figsize=(15, 10))
plot_tree(model, filled=True, feature_names=data.feature_names[:2], class_names=data.target_names)
plt.show()
# 輸出準確率
from sklearn.metrics import accuracy_score
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
輸出結果:運行上述代碼后,會生成一張決策樹的可視化圖,展示了決策樹如何根據特征進行分類。同時控制臺會輸出模型在測試集上的準確率。
6. 支持向量機 (SVM)
支持向量機是一種基于間隔最大化原則的分類和回歸方法。它試圖找到一個超平面,使得兩類樣本之間的間隔最大。對于非線性可分問題,可以通過核函數將數據映射到高維空間,從而找到合適的超平面。
代碼示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
# 創建數據集
X, y = make_blobs(n_samples=100, centers=2, 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)
# 可視化
def plot_svm_boundary(model, axis):
x0, x1 = np.meshgrid(
np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),
np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),
)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_predict = model.decision_function(X_new).reshape(x0.shape)
zero_line = y_predict == 0
plt.contour(x0, x1, y_predict, colors='k', levels=[-1, 0, 1], linestyles=['--', '-', '--'])
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plot_svm_boundary(model, axis=[-4, 4, -4, 4])
plt.show()
# 輸出準確率
from sklearn.metrics import accuracy_score
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
輸出結果:
運行上述代碼后,會生成一張決策邊界圖,展示了SVM模型如何區分兩類樣本。同時控制臺會輸出模型在測試集上的準確率。
7. K近鄰算法 (KNN)
K近鄰算法是一種基于實例的學習方法。給定一個測試樣本,KNN算法會在訓練集中找到距離最近的K個鄰居,并根據這些鄰居的標簽來預測測試樣本的標簽。通常采用歐氏距離作為距離度量。
代碼示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
# 創建數據集
X, y = make_classification(n_samples=100, n_features=2, n_redundant=0, n_informative=2,
random_state=1, n_clusters_per_class=1)
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創建KNN模型
model = KNeighborsClassifier(n_neighbors=3)
# 訓練模型
model.fit(X_train, y_train)
# 可視化
def plot_knn_boundary(model, axis):
x0, x1 = np.meshgrid(
np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),
np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),
)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_predict = model.predict(X_new).reshape(x0.shape)
plt.contourf(x0, x1, y_predict, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plot_knn_boundary(model, axis=[-3, 3, -3, 3])
plt.show()
# 輸出準確率
from sklearn.metrics import accuracy_score
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
輸出結果:運行上述代碼后,會生成一張決策邊界圖,展示了KNN模型如何區分兩類樣本。同時控制臺會輸出模型在測試集上的準確率。
實戰案例:手寫數字識別
手寫數字識別是一個經典的機器學習問題,可以用來驗證各種算法的效果。MNIST數據集包含了70000個大小為28x28像素的手寫數字圖片,其中60000張用于訓練,10000張用于測試。
代碼示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 加載MNIST數據集
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist['data'], mnist['target']
# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創建邏輯回歸模型
model = LogisticRegression(max_iter=1000)
# 訓練模型
model.fit(X_train, y_train)
# 預測
y_pred = model.predict(X_test)
# 輸出準確率
print("Accuracy:", accuracy_score(y_test, y_pred))
# 可視化預測結果
some_digit = X_test[0]
some_digit_image = some_digit.reshape(28, 28)
plt.imshow(some_digit_image, cmap=plt.cm.binary)
plt.axis("off")
plt.show()
print("Predicted:", model.predict([some_digit]))
print("Actual:", y_test[0])
輸出結果:運行上述代碼后,會輸出模型在測試集上的準確率,并展示一個測試樣本及其預測結果和真實標簽。
總結
本文介紹了幾種常用的機器學習算法,包括線性回歸、邏輯回歸、決策樹、支持向量機和K近鄰算法,并通過Python代碼示例展示了它們的具體應用。通過實戰案例手寫數字識別進一步驗證了這些算法的有效性。希望讀者能夠從中獲得對機器學習的理解和實踐能力。