Sklearn 深入教程
Scikit-learn(sklearn)是Python中功能強大且廣泛使用的機器學習庫。本教程將深入探討sklearn中的高級主題,涵蓋高級數據預處理、高級特征工程、復雜模型調參、高級集成學習、模型持久化與部署等內容。
目錄
- 高級數據預處理
- 復雜數據變換
- 生成多項式特征
- 自定義轉換器
- 高級特征工程
- 特征選擇算法
- 特征提取方法
- 復雜模型調參
- 隨機搜索
- 貝葉斯優化
- 高級集成學習
- 堆疊模型
- 多模型融合
- 模型持久化與部署
- 模型持久化
- 模型部署
高級數據預處理
復雜數據變換
在實際應用中,數據通常需要復雜的變換才能適應模型的需求。sklearn中的ColumnTransformer
可以幫助我們同時處理數值和類別特征。
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
import pandas as pd# 創建數據
data = pd.DataFrame({'numerical_feature': [1, 2, 3, 4],'categorical_feature': ['A', 'B', 'A', 'B']
})# 定義變換器
preprocessor = ColumnTransformer(transformers=[('num', StandardScaler(), ['numerical_feature']),('cat', OneHotEncoder(), ['categorical_feature'])])# 變換數據
data_transformed = preprocessor.fit_transform(data)
print(data_transformed)
生成多項式特征
多項式特征可以提升線性模型的表現。sklearn中的PolynomialFeatures
可以方便地生成多項式特征。
from sklearn.preprocessing import PolynomialFeatures# 創建數據
X = np.array([[2, 3], [3, 4], [4, 5]])# 生成多項式特征
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
print(X_poly)
自定義轉換器
有時我們需要進行一些特殊的數據變換,這時可以定義自定義轉換器。
from sklearn.base import BaseEstimator, TransformerMixinclass CustomTransformer(BaseEstimator, TransformerMixin):def __init__(self, factor=2):self.factor = factordef fit(self, X, y=None):return selfdef transform(self, X):return X * self.factor# 使用自定義轉換器
transformer = CustomTransformer(factor=3)
data_transformed = transformer.fit_transform(data[['numerical_feature']])
print(data_transformed)
高級特征工程
特征選擇算法
除了基本的特征選擇方法,sklearn還提供了基于模型的重要性進行特征選擇的功能。
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel# 加載數據
X, y = load_iris(return_X_y=True)# 使用隨機森林進行特征選擇
clf = RandomForestClassifier()
clf.fit(X, y)selector = SelectFromModel(clf, prefit=True)
X_new = selector.transform(X)
print("Selected Features Shape:", X_new.shape)
特征提取方法
除了PCA,sklearn還提供了其他特征提取方法,如LDA
(線性判別分析)。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis# 使用LDA進行特征提取
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X, y)
print("LDA Features Shape:", X_lda.shape)
復雜模型調參
隨機搜索
網格搜索在參數空間較大時會很耗時,隨機搜索是一個高效的替代方法。
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint# 定義參數分布
param_dist = {'n_estimators': randint(50, 200), 'max_depth': randint(2, 10)}# 隨機搜索
random_search = RandomizedSearchCV(clf, param_distributions=param_dist, n_iter=10, cv=5)
random_search.fit(X, y)
print("Best Parameters:", random_search.best_params_)
貝葉斯優化
貝葉斯優化是一種先進的優化技術,可以更高效地找到最佳參數。
from skopt import BayesSearchCV# 定義參數搜索空間
param_space = {'n_estimators': (50, 200), 'max_depth': (2, 10)}# 貝葉斯優化
bayes_search = BayesSearchCV(clf, search_spaces=param_space, n_iter=10, cv=5)
bayes_search.fit(X, y)
print("Best Parameters:", bayes_search.best_params_)
高級集成學習
堆疊模型
堆疊模型通過組合多個模型的輸出作為輸入來訓練一個更強的模型。
from sklearn.ensemble import StackingClassifier# 定義基礎模型
base_learners = [('rf', RandomForestClassifier(n_estimators=50)),('gb', GradientBoostingClassifier(n_estimators=50))
]# 堆疊分類器
stacking_clf = StackingClassifier(estimators=base_learners, final_estimator=LogisticRegression())
stacking_clf.fit(X_train, y_train)
y_pred = stacking_clf.predict(X_test)
print("Stacking Model Predictions:", y_pred)
多模型融合
多模型融合通過加權平均多個模型的預測結果來提高預測的穩定性。
from sklearn.ensemble import VotingClassifier# 多模型融合
voting_clf = VotingClassifier(estimators=base_learners, voting='soft')
voting_clf.fit(X_train, y_train)
y_pred = voting_clf.predict(X_test)
print("Voting Classifier Predictions:", y_pred)
模型持久化與部署
模型持久化
訓練好的模型可以使用joblib
或pickle
進行保存,以便后續使用。
import joblib# 模型保存
joblib.dump(stacking_clf, 'stacking_model.pkl')# 模型加載
loaded_model = joblib.load('stacking_model.pkl')
y_pred_loaded = loaded_model.predict(X_test)
print("Loaded Model Predictions:", y_pred_loaded)
模型部署
模型可以通過API進行部署,常見的方法是使用Flask或FastAPI。
from flask import Flask, request, jsonify
import joblibapp = Flask(__name__)# 加載模型
model = joblib.load('stacking_model.pkl')@app.route('/predict', methods=['POST'])
def predict():data = request.get_json(force=True)prediction = model.predict([data['features']])return jsonify({'prediction': prediction.tolist()})if __name__ == '__main__':app.run(port=5000, debug=True)
以上就是sklearn的深入教程。通過掌握這些高級技巧,您可以更靈活高效地處理數據、優化模型、并將模型部署到生產環境中。希望本教程對您有所幫助!