阿里云做網(wǎng)站經(jīng)費(fèi)免費(fèi)網(wǎng)站建設(shè)
機(jī)器學(xué)習(xí)庫(kù)scikit-learn(簡(jiǎn)稱sklearn)是Python中一個(gè)功能強(qiáng)大的機(jī)器學(xué)習(xí)庫(kù),它提供了大量用于數(shù)據(jù)挖掘和數(shù)據(jù)分析的工具,包括分類、回歸、聚類、降維等算法。文中我們一起簡(jiǎn)單探討sklearn的一些基礎(chǔ)知識(shí),總結(jié)梳理下sklean的結(jié)構(gòu)脈絡(luò),算是一個(gè)小小的入門教程吧。
目錄
- 一、安裝sklearn
- 二、數(shù)據(jù)預(yù)處理
- 2.1 特征縮放
- 1. StandardScaler
- 2. MinMaxScaler
- 3. MaxAbsScaler
- 4. RobustScaler
- 5. Normalizer
- 2.2 數(shù)據(jù)清洗
- 處理缺失值
- 2.3 編碼分類特征
- 獨(dú)熱編碼(One-Hot Encoding)
- 標(biāo)簽編碼(Label Encoding)
- 2.3. 特征選擇和降維
- 方差閾值
- 單變量特征選擇
- 主成分分析(PCA)
- 2.4. 數(shù)據(jù)拆分
- 2.5. 數(shù)據(jù)轉(zhuǎn)換
- 多項(xiàng)式特征
- 三、分類算法
- 邏輯回歸分類
- 四、回歸算法
- 線性回歸預(yù)測(cè)
- 五、模型評(píng)估與調(diào)優(yōu)
- 交叉驗(yàn)證和網(wǎng)格搜索
- 結(jié)語
一、安裝sklearn
先安裝Python環(huán)境??梢允褂胮ip來安裝sklearn庫(kù):
pip install scikit-learn
二、數(shù)據(jù)預(yù)處理
在使用sklearn進(jìn)行機(jī)器學(xué)習(xí)之前,需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。sklearn提供了一系列的數(shù)據(jù)預(yù)處理工具,如StandardScaler
用于特征縮放,OneHotEncoder
用于處理類別特征等。
2.1 特征縮放
在數(shù)據(jù)預(yù)處理中,特征縮放是一個(gè)非常重要的步驟,它可以幫助提升機(jī)器學(xué)習(xí)算法的性能和穩(wěn)定性。在sklearn庫(kù)中,提供了多種特征縮放和預(yù)處理的工具:
1. StandardScaler
- 作用:用于特征的標(biāo)準(zhǔn)化,即將特征值縮放到均值為0,方差為1的分布。
- 栗子:
from sklearn.preprocessing import StandardScaler
import numpy as np# 創(chuàng)建一個(gè)數(shù)據(jù)集
X = np.array([[1, 2], [3, 4], [5, 6]])# 初始化StandardScaler
scaler = StandardScaler()# 使用fit_transform方法對(duì)數(shù)據(jù)進(jìn)行縮放
X_scaled = scaler.fit_transform(X)print(X_scaled)
2. MinMaxScaler
- 作用:將特征數(shù)據(jù)縮放到一個(gè)指定的范圍(通常是0到1),或者也可以將每個(gè)特征的最大絕對(duì)值縮放到單位大小。
- 栗子:
from sklearn.preprocessing import MinMaxScalerdata = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = MinMaxScaler()# 使用fit_transform方法對(duì)數(shù)據(jù)進(jìn)行縮放
scaled_data = scaler.fit_transform(data)print(scaled_data)
3. MaxAbsScaler
- 作用:將每個(gè)特征縮放到[-1, 1]的范圍內(nèi),通過除以每個(gè)特征的最大絕對(duì)值來實(shí)現(xiàn)。
- 栗子:
from sklearn.preprocessing import MaxAbsScalerX = np.array([[1, -1, 2], [2, 0, 0], [0, 1, -1]])
scaler = MaxAbsScaler()# 使用fit_transform方法對(duì)數(shù)據(jù)進(jìn)行縮放
X_scaled = scaler.fit_transform(X)print(X_scaled)
4. RobustScaler
- 作用:使用中位數(shù)和四分位數(shù)范圍(IQR)來縮放特征。這對(duì)于有許多離群點(diǎn)的數(shù)據(jù)集特別有用。
- 栗子:
from sklearn.preprocessing import RobustScalerX = np.array([[1, -2, 2], [2, -1, 0], [0, 1, -1]])
scaler = RobustScaler()# 使用fit_transform方法對(duì)數(shù)據(jù)進(jìn)行縮放
X_scaled = scaler.fit_transform(X)print(X_scaled)
5. Normalizer
- 作用:將每個(gè)樣本縮放到單位范數(shù),即使得每個(gè)樣本的L1或L2范數(shù)為1。
- 栗子:
from sklearn.preprocessing import NormalizerX = np.array([[1, 2], [3, 4], [5, 6]])
normalizer = Normalizer(norm='l2') # 可以選擇'l1'或'l2'范數(shù)# 使用fit_transform方法對(duì)數(shù)據(jù)進(jìn)行縮放
X_normalized = normalizer.fit_transform(X)print(X_normalized)
2.2 數(shù)據(jù)清洗
數(shù)據(jù)清洗包括處理缺失值、異常值、重復(fù)值等。
處理缺失值
- 栗子:使用
SimpleImputer
填充缺失值。
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean') # 可以選擇'mean'、'median'、'most_frequent'等策略
X_train_imputed = imputer.fit_transform(X_train)
2.3 編碼分類特征
對(duì)于分類數(shù)據(jù),需要將其轉(zhuǎn)換為機(jī)器學(xué)習(xí)模型可以理解的數(shù)值形式。
獨(dú)熱編碼(One-Hot Encoding)
- 栗子:使用
OneHotEncoder
進(jìn)行獨(dú)熱編碼。
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
X_train_encoded = encoder.fit_transform(X_train)
標(biāo)簽編碼(Label Encoding)
- 雖然sklearn不直接提供標(biāo)簽編碼的類,但可以使用
LabelEncoder
對(duì)目標(biāo)變量進(jìn)行編碼。
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_train_encoded = le.fit_transform(y_train)
2.3. 特征選擇和降維
選擇重要的特征或降低數(shù)據(jù)的維度可以幫助提高模型的效率和準(zhǔn)確性。
方差閾值
- 栗子:使用
VarianceThreshold
刪除方差低于閾值的特征。
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.1)
X_train_selected = selector.fit_transform(X_train)
單變量特征選擇
- 栗子:使用
SelectKBest
選擇與目標(biāo)變量相關(guān)性最高的K個(gè)特征。
from sklearn.feature_selection import SelectKBest, f_regression
selector = SelectKBest(score_func=f_regression, k=5)
X_train_selected = selector.fit_transform(X_train, y_train)
主成分分析(PCA)
- PCA是一種常用的降維技術(shù),雖然它不屬于預(yù)處理步驟,但經(jīng)常在數(shù)據(jù)預(yù)處理后使用。
from sklearn.decomposition import PCA
pca = PCA(n_components=2) # 指定要保留的主成分?jǐn)?shù)量
X_train_reduced = pca.fit_transform(X_train)
2.4. 數(shù)據(jù)拆分
在機(jī)器學(xué)習(xí)中,通常需要將數(shù)據(jù)集拆分為訓(xùn)練集和測(cè)試集。
- 栗子:使用
train_test_split
拆分?jǐn)?shù)據(jù)集。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2.5. 數(shù)據(jù)轉(zhuǎn)換
數(shù)據(jù)轉(zhuǎn)換包括將數(shù)據(jù)集轉(zhuǎn)換為更適合機(jī)器學(xué)習(xí)模型的形式。
多項(xiàng)式特征
- 栗子:使用
PolynomialFeatures
生成多項(xiàng)式特征。
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2) # 指定多項(xiàng)式的度數(shù)
X_train_poly = poly.fit_transform(X_train)
這些預(yù)處理工具和技術(shù)在sklearn庫(kù)中都有提供,可以根據(jù)具體的數(shù)據(jù)集和機(jī)器學(xué)習(xí)任務(wù)來選擇合適的預(yù)處理步驟。
三、分類算法
分類算法是機(jī)器學(xué)習(xí)領(lǐng)域的一個(gè)重要分支,旨在根據(jù)輸入數(shù)據(jù)的特征將其劃分為不同的類別。下面勒是一些常用的分類算法:
-
邏輯回歸(Logistic Regression):
- 邏輯回歸是一種線性分類算法,通過邏輯函數(shù)預(yù)測(cè)概率,根據(jù)概率決定分類的閾值。
- 適用于二分類問題,如預(yù)測(cè)郵件是否為垃圾郵件。
-
決策樹(Decision Tree):
- 通過遞歸地選擇最佳特征并對(duì)特征進(jìn)行分割,構(gòu)建樹形結(jié)構(gòu)進(jìn)行分類。
- 易于理解和解釋,能處理數(shù)值型和類別型數(shù)據(jù)。
- 可用于銀行決定是否給客戶貸款等場(chǎng)景。
-
支持向量機(jī)(Support Vector Machine, SVM):
- SVM通過尋找最大邊際超平面來分隔不同的類別。
- 在高維空間表現(xiàn)良好,適用于小樣本數(shù)據(jù)集,但對(duì)大規(guī)模數(shù)據(jù)集的訓(xùn)練效率較低。
- 可應(yīng)用于手寫數(shù)字識(shí)別等任務(wù)。
-
樸素貝葉斯(Naive Bayes):
- 基于貝葉斯定理的分類算法,假設(shè)特征之間相互獨(dú)立。
- 簡(jiǎn)單、高效,特別適用于文本分類,如新聞文章分類。
-
K-近鄰算法(K-Nearest Neighbors, KNN):
- 基于實(shí)例的學(xué)習(xí)方法,通過計(jì)算待分類樣本與訓(xùn)練樣本的距離來進(jìn)行分類。
- 簡(jiǎn)單直觀,但計(jì)算成本隨數(shù)據(jù)集增大而增加。
- 可用于房地產(chǎn)價(jià)格評(píng)估等場(chǎng)景。
-
隨機(jī)森林(Random Forest):
- 一種集成學(xué)習(xí)方法,通過構(gòu)建多個(gè)決策樹并進(jìn)行投票來提高分類準(zhǔn)確性。
- 能有效減少過擬合,提高模型的穩(wěn)定性。
- 可應(yīng)用于信用卡欺詐檢測(cè)等任務(wù)。
-
梯度提升樹(Gradient Boosting Trees, GBT):
- 另一種集成學(xué)習(xí)算法,通過逐步添加新的弱分類器來糾正前一個(gè)模型的錯(cuò)誤。
- 在許多機(jī)器學(xué)習(xí)競(jìng)賽中表現(xiàn)優(yōu)異,但訓(xùn)練時(shí)間可能較長(zhǎng)。
- 可用于優(yōu)化用戶行為預(yù)測(cè)等場(chǎng)景。
-
神經(jīng)網(wǎng)絡(luò)(Neural Networks):
- 神經(jīng)網(wǎng)絡(luò)是通過模擬人腦神經(jīng)元連接方式而建立的一種復(fù)雜網(wǎng)絡(luò)模型。
- 適用于圖像識(shí)別、語音識(shí)別、自然語言處理等復(fù)雜任務(wù)。
- 常見的神經(jīng)網(wǎng)絡(luò)類型包括前饋神經(jīng)網(wǎng)絡(luò)、反饋神經(jīng)網(wǎng)絡(luò)和圖神經(jīng)網(wǎng)絡(luò)等。其中前饋神經(jīng)網(wǎng)絡(luò)(如多層感知機(jī))是應(yīng)用最廣泛的類型之一。
這些分類算法各有特點(diǎn)和適用場(chǎng)景,下面整一個(gè)使用邏輯回歸進(jìn)行分類的例子吧:
邏輯回歸分類
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 加載iris數(shù)據(jù)集
iris = load_iris()
X = iris.data
y = iris.target# 劃分訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化邏輯回歸模型
logreg = LogisticRegression()# 訓(xùn)練模型
logreg.fit(X_train, y_train)# 預(yù)測(cè)測(cè)試集
y_pred = logreg.predict(X_test)# 計(jì)算準(zhǔn)確率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
四、回歸算法
回歸算法是用于預(yù)測(cè)連續(xù)數(shù)值輸出的監(jiān)督學(xué)習(xí)算法。下面是一些常用的回歸算法:
-
線性回歸(Linear Regression):
- 線性回歸用于建立連續(xù)數(shù)值輸出與一個(gè)或多個(gè)輸入特征之間的線性關(guān)系。
- 它假設(shè)輸出與輸入特征之間存在線性關(guān)系,即可以用一條直線或平面來擬合數(shù)據(jù)。
- 線性回歸的目標(biāo)是找到一條最佳擬合直線,以最小化預(yù)測(cè)值與真實(shí)值之間的誤差。
-
多項(xiàng)式回歸(Polynomial Regression):
- 多項(xiàng)式回歸是線性回歸的擴(kuò)展,通過引入多項(xiàng)式特征來處理非線性關(guān)系。
- 它能夠擬合更復(fù)雜的數(shù)據(jù)分布,特別是當(dāng)數(shù)據(jù)呈現(xiàn)非線性趨勢(shì)時(shí)。
-
嶺回歸(Ridge Regression):
- 嶺回歸是一種正則化的線性回歸方法,用于處理共線性問題(即特征之間高度相關(guān))。
- 通過在損失函數(shù)中加入L2正則化項(xiàng),嶺回歸能夠收縮回歸系數(shù),減少模型的復(fù)雜度,防止過擬合。
-
Lasso回歸(Lasso Regression):
- Lasso回歸也是一種正則化的線性回歸方法,與嶺回歸類似,但使用的是L1正則化。
- Lasso回歸傾向于產(chǎn)生稀疏的回歸系數(shù),即某些系數(shù)會(huì)變?yōu)榱?#xff0c;從而實(shí)現(xiàn)特征的自動(dòng)選擇。
-
彈性網(wǎng)絡(luò)回歸(Elastic Net Regression):
- 彈性網(wǎng)絡(luò)回歸是嶺回歸和Lasso回歸的折中方法。
- 它同時(shí)使用了L1和L2正則化,通過調(diào)整兩者的權(quán)重來平衡模型的稀疏性和穩(wěn)定性。
-
支持向量回歸(Support Vector Regression, SVR):
- 支持向量回歸是支持向量機(jī)在回歸問題上的應(yīng)用。
- 它試圖找到一個(gè)超平面,使得所有數(shù)據(jù)點(diǎn)到該超平面的距離之和最小。
- SVR對(duì)異常值具有一定的魯棒性,并且適用于高維數(shù)據(jù)。
-
決策樹回歸(Decision Tree Regression):
- 決策樹回歸使用樹形結(jié)構(gòu)來表示輸入特征與輸出值之間的關(guān)系。
- 通過遞歸地將數(shù)據(jù)劃分為不同的子集,并基于某些準(zhǔn)則(如信息增益)選擇最佳劃分點(diǎn)。
- 決策樹易于理解和解釋,但可能容易過擬合。
-
隨機(jī)森林回歸(Random Forest Regression):
- 隨機(jī)森林回歸是一種集成學(xué)習(xí)方法,通過構(gòu)建多個(gè)決策樹并對(duì)它們的預(yù)測(cè)結(jié)果進(jìn)行平均來提高預(yù)測(cè)精度。
- 隨機(jī)森林能夠減少模型的方差,提高泛化能力,并且相對(duì)不容易過擬合。
-
梯度提升回歸樹(Gradient Boosting Regression Trees, GBRT):
- 梯度提升回歸樹是一種迭代的決策樹算法,通過逐步添加新的樹來修正前面樹的預(yù)測(cè)錯(cuò)誤。
- 每棵新樹都嘗試預(yù)測(cè)前面所有樹的殘差(真實(shí)值與當(dāng)前預(yù)測(cè)值之間的差)。
- GBRT通常具有較高的預(yù)測(cè)精度,但也可能容易過擬合。
這些回歸算法各有優(yōu)勢(shì)和適用場(chǎng)景,以下是一個(gè)使用線性回歸進(jìn)行預(yù)測(cè)的簡(jiǎn)單例子:
線性回歸預(yù)測(cè)
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 生成一個(gè)簡(jiǎn)單的回歸數(shù)據(jù)集
X, y = make_regression(n_samples=100, n_features=1, noise=0.1)# 劃分訓(xùn)練集和測(cè)試集(略)
# ...# 初始化線性回歸模型
linreg = LinearRegression()# 訓(xùn)練模型
linreg.fit(X_train, y_train)# 預(yù)測(cè)測(cè)試集
y_pred = linreg.predict(X_test)# 計(jì)算均方誤差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
五、模型評(píng)估與調(diào)優(yōu)
sklearn還提供了豐富的模型評(píng)估工具和調(diào)優(yōu)方法??梢允褂媒徊骝?yàn)證來評(píng)估模型的性能,使用網(wǎng)格搜索來找到最佳的模型參數(shù)。
交叉驗(yàn)證和網(wǎng)格搜索
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris# 加載iris數(shù)據(jù)集(略)
# ...# 初始化SVC模型
svc = SVC()# 使用5折交叉驗(yàn)證評(píng)估模型性能
scores = cross_val_score(svc, X, y, cv=5)
print(f"Cross-validation scores: {scores}")
print(f"Mean cross-validation score: {scores.mean()}")# 使用網(wǎng)格搜索找到最佳參數(shù)
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
clf = GridSearchCV(svc, parameters, cv=5)
clf.fit(X_train, y_train)
print(f"Best parameters: {clf.best_params_}")
print(f"Best score: {clf.best_score_}")
結(jié)語
這篇博客,介紹了解了sklearn庫(kù)的基礎(chǔ)知識(shí),通過幾個(gè)簡(jiǎn)單的例子展示了如何使用它進(jìn)行數(shù)據(jù)處理、分類、回歸以及模型評(píng)估與調(diào)優(yōu)。當(dāng)然,sklearn還提供了更多高級(jí)的功能和算法,如聚類、降維、異常檢測(cè)等,這些都有待我們?nèi)ヌ剿骱蛯W(xué)習(xí)。希望這篇博客能作為學(xué)習(xí)sklearn的起點(diǎn),助你在機(jī)器學(xué)習(xí)的道路上越走越遠(yuǎn)!