Python 中快速上手機器學(xué)習(xí)的七個基礎(chǔ)算法
機器學(xué)習(xí)作為一種讓計算機從數(shù)據(jù)中自動學(xué)習(xí)的技術(shù),在近年來得到了迅猛發(fā)展。本文將介紹幾種基礎(chǔ)的機器學(xué)習(xí)算法,并通過Python代碼示例展示它們的應(yīng)用。
1. 什么是機器學(xué)習(xí)
機器學(xué)習(xí)是一種讓計算機學(xué)會從數(shù)據(jù)中自動“學(xué)習(xí)”并做出預(yù)測或決策的技術(shù)。不需要顯式地編程告訴計算機如何執(zhí)行任務(wù)。機器學(xué)習(xí)的核心在于構(gòu)建模型,通過大量數(shù)據(jù)訓(xùn)練模型,使其能夠準(zhǔn)確預(yù)測未知數(shù)據(jù)的結(jié)果。
2. 為什么選擇Python
Python語言簡單易學(xué),擁有強大的科學(xué)計算庫,如NumPy、Pandas、Scikit-learn等。這些庫提供了大量的函數(shù)和工具,可以方便地處理數(shù)據(jù)、訓(xùn)練模型、評估性能。
3. 線性回歸
線性回歸是最簡單的機器學(xué)習(xí)算法之一。它假設(shè)因變量y與自變量x之間存在線性關(guān)系,即y = ax + b。線性回歸的目標(biāo)是找到最佳擬合直線,使得所有點到直線的距離平方和最小。
代碼示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 創(chuàng)建數(shù)據(jù)集
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創(chuàng)建線性回歸模型
model = LinearRegression()
# 訓(xùn)練模型
model.fit(X_train, y_train)
# 預(yù)測
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()
# 輸出系數(shù)和截距
print("Coefficient:", model.coef_)
print("Intercept:", model.intercept_)
輸出結(jié)果:運行上述代碼后,會生成一張散點圖,其中藍(lán)色點表示真實值,紅色線表示預(yù)測值。同時控制臺會輸出模型的系數(shù)和截距。
4. 邏輯回歸
邏輯回歸主要用于解決二分類問題。它通過Sigmoid函數(shù)將線性組合映射到[0,1]區(qū)間內(nèi),代表事件發(fā)生的概率。邏輯回歸的目標(biāo)是最大化似然函數(shù),即找到一組參數(shù)使得訓(xùn)練樣本出現(xiàn)的概率最大。
代碼示例:
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
# 創(chuàng)建數(shù)據(jù)集
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ùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創(chuàng)建邏輯回歸模型
model = LogisticRegression()
# 訓(xùn)練模型
model.fit(X_train, y_train)
# 預(yù)測
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()
# 輸出準(zhǔn)確率
from sklearn.metrics import accuracy_score
print("Accuracy:", accuracy_score(y_test, y_pred))
輸出結(jié)果:運行上述代碼后,會生成一張決策邊界圖,展示了邏輯回歸模型如何區(qū)分兩類樣本。同時控制臺會輸出模型在測試集上的準(zhǔn)確率。
5. 決策樹
決策樹是一種樹形結(jié)構(gòu)的分類和回歸算法。它通過遞歸地劃分?jǐn)?shù)據(jù)集,構(gòu)建一棵樹形結(jié)構(gòu),最終實現(xiàn)分類或回歸。每個內(nèi)部節(jié)點表示一個屬性上的測試,每個分支表示一個測試結(jié)果,每個葉節(jié)點表示一個類別或數(shù)值。
代碼示例:
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
# 加載數(shù)據(jù)集
data = load_iris()
X = data.data[:, :2] # 只使用前兩個特征
y = data.target
# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創(chuàng)建決策樹模型
model = DecisionTreeClassifier(max_depth=3)
# 訓(xùn)練模型
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()
# 輸出準(zhǔn)確率
from sklearn.metrics import accuracy_score
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
輸出結(jié)果:運行上述代碼后,會生成一張決策樹的可視化圖,展示了決策樹如何根據(jù)特征進(jìn)行分類。同時控制臺會輸出模型在測試集上的準(zhǔn)確率。
6. 支持向量機 (SVM)
支持向量機是一種基于間隔最大化原則的分類和回歸方法。它試圖找到一個超平面,使得兩類樣本之間的間隔最大。對于非線性可分問題,可以通過核函數(shù)將數(shù)據(jù)映射到高維空間,從而找到合適的超平面。
代碼示例:
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
# 創(chuàng)建數(shù)據(jù)集
X, y = make_blobs(n_samples=100, centers=2, random_state=42)
# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創(chuàng)建SVM模型
model = SVC(kernel='linear')
# 訓(xùn)練模型
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()
# 輸出準(zhǔn)確率
from sklearn.metrics import accuracy_score
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
輸出結(jié)果:
運行上述代碼后,會生成一張決策邊界圖,展示了SVM模型如何區(qū)分兩類樣本。同時控制臺會輸出模型在測試集上的準(zhǔn)確率。
7. K近鄰算法 (KNN)
K近鄰算法是一種基于實例的學(xué)習(xí)方法。給定一個測試樣本,KNN算法會在訓(xùn)練集中找到距離最近的K個鄰居,并根據(jù)這些鄰居的標(biāo)簽來預(yù)測測試樣本的標(biāo)簽。通常采用歐氏距離作為距離度量。
代碼示例:
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
# 創(chuàng)建數(shù)據(jù)集
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ùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創(chuàng)建KNN模型
model = KNeighborsClassifier(n_neighbors=3)
# 訓(xùn)練模型
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()
# 輸出準(zhǔn)確率
from sklearn.metrics import accuracy_score
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
輸出結(jié)果:運行上述代碼后,會生成一張決策邊界圖,展示了KNN模型如何區(qū)分兩類樣本。同時控制臺會輸出模型在測試集上的準(zhǔn)確率。
實戰(zhàn)案例:手寫數(shù)字識別
手寫數(shù)字識別是一個經(jīng)典的機器學(xué)習(xí)問題,可以用來驗證各種算法的效果。MNIST數(shù)據(jù)集包含了70000個大小為28x28像素的手寫數(shù)字圖片,其中60000張用于訓(xùn)練,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數(shù)據(jù)集
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist['data'], mnist['target']
# 劃分訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 創(chuàng)建邏輯回歸模型
model = LogisticRegression(max_iter=1000)
# 訓(xùn)練模型
model.fit(X_train, y_train)
# 預(yù)測
y_pred = model.predict(X_test)
# 輸出準(zhǔn)確率
print("Accuracy:", accuracy_score(y_test, y_pred))
# 可視化預(yù)測結(jié)果
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])
輸出結(jié)果:運行上述代碼后,會輸出模型在測試集上的準(zhǔn)確率,并展示一個測試樣本及其預(yù)測結(jié)果和真實標(biāo)簽。
總結(jié)
本文介紹了幾種常用的機器學(xué)習(xí)算法,包括線性回歸、邏輯回歸、決策樹、支持向量機和K近鄰算法,并通過Python代碼示例展示了它們的具體應(yīng)用。通過實戰(zhàn)案例手寫數(shù)字識別進(jìn)一步驗證了這些算法的有效性。希望讀者能夠從中獲得對機器學(xué)習(xí)的理解和實踐能力。