一、機器學習與sklearn簡介
機器學習是人工智能的一個分支,它通過算法讓計算機從數據中學習規律,并基于這些規律做出預測或決策。scikit-learn(簡稱sklearn)是Python中最流行的機器學習庫之一,它提供了各種監督學習和無監督學習的算法實現。
sklearn的主要特點:
-
簡單高效的數據挖掘和數據分析工具
-
基于NumPy、SciPy和matplotlib構建
-
開源且商業可用 - BSD許可證
-
豐富的算法支持:分類、回歸、聚類、降維等
-
完善的文檔和豐富的社區資源
二、sklearn基礎API結構
sklearn的API設計非常一致,主要包含以下幾個核心接口:
-
估計器(Estimator): 用于擬合模型的任何對象,如分類器、回歸器等
-
轉換器(Transformer): 用于數據預處理和特征工程的估計器
-
預測器(Predictor): 能夠進行預測的估計器
-
模型評估: 用于評估模型性能的工具
三、數據預處理API詳解
1. 標準化 (StandardScaler)
from sklearn.preprocessing import StandardScaler"""
StandardScaler參數說明:
- copy : boolean, default=True是否創建數據的副本,如果為False,則在原始數據上執行標準化
- with_mean : boolean, default=True是否將數據居中(減去均值)
- with_std : boolean, default=True是否將數據縮放到單位方差
"""# 示例代碼
scaler = StandardScaler(copy=True, with_mean=True, with_std=True)
data = [[0, 0], [0, 0], [1, 1], [1, 1]]
scaler.fit(data) # 計算均值和標準差
print(scaler.mean_) # 輸出均值 [0.5 0.5]
print(scaler.scale_) # 輸出標準差 [0.5 0.5]
transformed_data = scaler.transform(data)
print(transformed_data)
"""
輸出標準化后的數據:
[[-1. -1.][-1. -1.][ 1. 1.][ 1. 1.]]
"""
2. 歸一化 (MinMaxScaler)?
from sklearn.preprocessing import MinMaxScaler"""
MinMaxScaler參數說明:
- feature_range : tuple (min, max), default=(0, 1)期望的轉換后數據范圍
- copy : boolean, default=True是否創建數據的副本
"""scaler = MinMaxScaler(feature_range=(0, 1))
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler.fit(data)
print(scaler.data_min_) # 輸出最小值 [-1. 2.]
print(scaler.data_max_) # 輸出最大值 [ 1. 18.]
transformed_data = scaler.transform(data)
print(transformed_data)
"""
輸出歸一化后的數據:
[[0. 0. ][0.25 0.25][0.5 0.5 ][1. 1. ]]
"""
四、監督學習API詳解
1. 線性回歸 (LinearRegression)
from sklearn.linear_model import LinearRegression"""
LinearRegression參數說明:
- fit_intercept : boolean, default=True是否計算此模型的截距
- normalize : boolean, default=False是否在回歸前對回歸變量X進行歸一化
- copy_X : boolean, default=True是否復制X,否則可能會被覆蓋
- n_jobs : int, default=None用于計算的作業數
"""# 示例代碼
X = [[1, 1], [1, 2], [2, 2], [2, 3]] # 特征
y = [1, 2, 2, 3] # 目標值model = LinearRegression(fit_intercept=True, normalize=False)
model.fit(X, y) # 擬合模型print(f"系數: {model.coef_}") # 輸出: [0.4 0.6]
print(f"截距: {model.intercept_}") # 輸出: 0.2
print(f"R2分數: {model.score(X, y)}") # 輸出: 0.8# 預測新數據
print(model.predict([[3, 5]])) # 輸出: [4.4]
2. 支持向量機分類 (SVC)?
from sklearn.svm import SVC"""
SVC參數說明:
- C : float, default=1.0正則化參數,強度與C成反比
- kernel : {'linear', 'poly', 'rbf', 'sigmoid'}, default='rbf'指定算法中使用的內核類型
- degree : int, default=3多項式核函數的次數('poly'時使用)
- gamma : {'scale', 'auto'} or float, default='scale'核系數
- probability : bool, default=False是否啟用概率估計
"""# 示例代碼
X = [[0, 0], [1, 1], [1, 0], [0, 1]] # 特征
y = [0, 1, 1, 0] # 類別標簽model = SVC(C=1.0, kernel='rbf', gamma='scale', probability=False)
model.fit(X, y) # 訓練模型print("支持向量索引:", model.support_) # 輸出支持向量的索引
print("支持向量:", model.support_vectors_) # 輸出支持向量
print("各類的支持向量數量:", model.n_support_) # 輸出每類的支持向量數量# 預測新數據
print(model.predict([[0.5, 0.5]])) # 輸出: [1]
五、模型評估API詳解
1. 交叉驗證 (cross_val_score)
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier"""
cross_val_score參數說明:
- estimator : 估計器對象實現"fit"和"score"方法的對象
- X : 數組要擬合的數據
- y : 數組目標變量
- cv : int, 交叉驗證生成器或可迭代對象, default=None確定交叉驗證拆分策略
- scoring : str或可調用對象, default=None評分策略
- n_jobs : int, default=None并行運行的作業數
"""# 示例代碼
X = [[0, 0], [1, 1], [2, 2], [3, 3]] # 特征
y = [0, 1, 0, 1] # 類別標簽model = RandomForestClassifier(n_estimators=10)
scores = cross_val_score(model, X, y, cv=2, scoring='accuracy')print(f"交叉驗證分數: {scores}") # 輸出類似: [1. 0.5]
print(f"平均分數: {scores.mean():.2f}") # 輸出類似: 0.75
2. 分類報告 (classification_report)?
from sklearn.metrics import classification_report
from sklearn.svm import SVC# 示例代碼
X_train = [[0, 0], [1, 1], [2, 2], [3, 3]]
y_train = [0, 1, 0, 1]
X_test = [[0.5, 0.5], [2.5, 2.5]]
y_test = [0, 1]model = SVC().fit(X_train, y_train)
y_pred = model.predict(X_test)report = classification_report(y_test, y_pred)
print(report)
"""
輸出:precision recall f1-score support0 1.00 1.00 1.00 11 1.00 1.00 1.00 1accuracy 1.00 2macro avg 1.00 1.00 1.00 2weighted avg 1.00 1.00 1.00 2
"""
六、無監督學習API詳解
1. K-Means聚類
from sklearn.cluster import KMeans"""
KMeans參數說明:
- n_clusters : int, default=8要形成的簇數
- init : {'k-means++', 'random'}, default='k-means++'初始化方法
- n_init : int, default=10使用不同質心種子運行算法的次數
- max_iter : int, default=300單次運行的最大迭代次數
- tol : float, default=1e-4收斂閾值
"""# 示例代碼
X = [[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]model = KMeans(n_clusters=2, init='k-means++', n_init=10)
model.fit(X)print("簇中心:", model.cluster_centers_)
print("預測標簽:", model.labels_)
print("預測新數據:", model.predict([[0, 0], [4, 4]]))
"""
輸出示例:
簇中心: [[1. 2.] [4. 2.]]
預測標簽: [0 0 0 1 1 1]
預測新數據: [0 1]
"""
2. 主成分分析 (PCA)?
from sklearn.decomposition import PCA"""
PCA參數說明:
- n_components : int, float or 'mle', default=None保留的主成分數量
- copy : bool, default=True是否在運行算法時保留原始數據
- whiten : bool, default=False是否白化數據
- svd_solver : {'auto', 'full', 'arpack', 'randomized'}, default='auto'使用的SVD求解器
"""# 示例代碼
X = [[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]pca = PCA(n_components=1)
pca.fit(X)
print("解釋方差比例:", pca.explained_variance_ratio_) # 輸出: [0.9924...]
print("主成分:", pca.components_) # 輸出: [[-0.838 -0.545]]X_transformed = pca.transform(X)
print("降維后的數據:", X_transformed)
"""
輸出示例:
降維后的數據: [[ 1.383][ 2.222][ 3.605][-1.383][-2.222][-3.605]]
"""
七、模型選擇與參數調優
1. 網格搜索 (GridSearchCV)
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC"""
GridSearchCV參數說明:
- estimator : 估計器對象實現"fit"和"score"方法的對象
- param_grid : dict或列表參數名到參數值列表的映射
- cv : int, 交叉驗證生成器或可迭代對象, default=None確定交叉驗證拆分策略
- scoring : str或可調用對象, default=None評分策略
- n_jobs : int, default=None并行運行的作業數
"""# 示例代碼
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svc = SVC()
clf = GridSearchCV(svc, parameters, cv=5)
clf.fit([[0, 0], [1, 1], [2, 2], [3, 3]], [0, 1, 0, 1])print("最佳參數:", clf.best_params_)
print("最佳分數:", clf.best_score_)
print("最佳估計器:", clf.best_estimator_)
"""
輸出示例:
最佳參數: {'C': 1, 'kernel': 'linear'}
最佳分數: 0.75
最佳估計器: SVC(C=1, kernel='linear')
"""
八、sklearn使用最佳實踐
-
數據預處理:始終對數據進行適當的縮放和歸一化
-
訓練測試分割:在訓練前分割數據,避免數據泄露
-
交叉驗證:使用交叉驗證評估模型性能
-
參數調優:使用網格搜索或隨機搜索優化超參數
-
模型持久化:使用joblib保存訓練好的模型
-
特征工程:嘗試不同的特征提取和選擇方法
-
集成方法:考慮使用集成方法提高模型性能
# 示例:完整機器學習流程
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report
from joblib import dump# 加載數據
iris = load_iris()
X, y = iris.data, iris.target# 分割數據
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42
)# 數據預處理
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# 訓練模型
model = SVC(kernel='rbf', C=1.0, gamma='scale')
model.fit(X_train_scaled, y_train)# 評估模型
y_pred = model.predict(X_test_scaled)
print(classification_report(y_test, y_pred))# 保存模型
dump(model, 'iris_classifier.joblib')
九、總結
scikit-learn提供了強大而一致的API接口,使得機器學習模型的實現變得簡單高效。通過本文的詳細講解和代碼示例,你應該已經掌握了:
-
sklearn的基本結構和設計理念
-
數據預處理的關鍵API及其參數
-
監督學習和無監督學習的主要算法實現
-
模型評估和參數調優的方法
-
完整的機器學習流程實現
在實際應用中,建議多參考sklearn的官方文檔,并根據具體問題選擇合適的算法和參數。機器學習是一個實踐性很強的領域,多動手嘗試不同的方法和參數組合,才能更好地掌握這些工具。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?