python之sklearn學習筆記
前言:本文是學習筆記。
sklearn介紹
scikit-learn是資料探勘與分析的簡單而有效的工具。
依賴於NumPy, SciPy和matplotlib。
它主要包含以下幾部分內容:
- 從功能來分:
- classification
- Regression
- Clustering
- Dimensionality reduction
- Model selection
- Preprocessing
- 從API模組來分:
sklearn.base
: Base classes and utility functionsklearn.cluster
: Clusteringsklearn.cluster
sklearn.covariance
: Covariance Estimatorssklearn.model_selection
: Model Selectionsklearn.datasets
: Datasetssklearn.decomposition
: Matrix Decompositionsklearn.dummy
: Dummy estimatorssklearn.ensemble
: Ensemble Methodssklearn.exceptions
: Exceptions and warningssklearn.feature_extraction
sklearn.feature_selection
: Feature Selectionsklearn.gaussian_process
: Gaussian Processessklearn.isotonic
: Isotonic regressionsklearn.kernel_approximation
: Kernel Approximationsklearn.kernel_ridge
: Kernel Ridge Regressionsklearn.discriminant_analysis
: Discriminant Analysissklearn.linear_model
: Generalized Linear Modelssklearn.manifold
: Manifold Learningsklearn.metrics
: Metricssklearn.mixture
: Gaussian Mixture Modelssklearn.multiclass
: Multiclass and multilabel classificationsklearn.multioutput
: Multioutput regression and classificationsklearn.naive_bayes
: Naive Bayessklearn.neighbors
: Nearest Neighborssklearn.neural_network
: Neural network modelssklearn.calibration
: Probability Calibrationsklearn.cross_decomposition
: Cross decompositionsklearn.pipeline
: Pipelinesklearn.preprocessing
: Preprocessing and Normalizationsklearn.random_projection
: Random projectionsklearn.semi_supervised
: Semi-Supervised Learningsklearn.svm
: Support Vector Machinessklearn.tree
: Decision Treesklearn.utils
: Utilities
就我目前的菜鳥級別,感覺經常用到的有clustering, classification(svm, tree, linear regression 等), decomposition, preprocessing, metrics等,所以先從這些地方學起來。
cluster
閱讀sklearn.cluster
的API,可以發現裡面主要有兩個內容:一個是各種聚類方法的class如cluster.KMeans
,一個是可以直接使用的聚類方法的函式如
sklearn.cluster.k_means(X, n_clusters, init='k-means++',
precompute_distances='auto', n_init=10, max_iter=300,
verbose=False, tol=0.0001, random_state=None,
copy_x=True, n_jobs=1, algorithm='auto', return_n_iter=False)
所以實際使用中,對應也有兩種方法。
在sklearn.cluster
共有9種聚類方法,分別是
- AffinityPropagation: 吸引子傳播
- AgglomerativeClustering: 層次聚類
- Birch
- DBSCAN
- FeatureAgglomeration: 特徵聚集
- KMeans: K均值聚類
- MiniBatchKMeans
- MeanShift
- SpectralClustering: 譜聚類
拿我們最熟悉的Kmeans舉例說明:
採用類構造器,來構造Kmeans聚類器
首先API中KMeans的建構函式為:
sklearn.cluster.KMeans(n_clusters=8,
init='k-means++',
n_init=10,
max_iter=300,
tol=0.0001,
precompute_distances='auto',
verbose=0,
random_state=None,
copy_x=True,
n_jobs=1,
algorithm='auto'
)
引數的意義:
n_clusters
:簇的個數,即你想聚成幾類init
: 初始簇中心的獲取方法n_init
: 獲取初始簇中心的更迭次數max_iter
: 最大迭代次數(因為kmeans演算法的實現需要迭代)tol
: 容忍度,即kmeans執行準則收斂的條件precompute_distances
:是否需要提前計算距離verbose
: 冗長模式(不太懂是啥意思,反正一般不去改預設值)random_state
: 隨機生成簇中心的狀態條件。copy_x
: 對是否修改資料的一個標記,如果True,即複製了就不會修改資料。n_jobs
: 並行設定algorithm
: kmeans的實現演算法,有:'auto'
,'full'
,'elkan'
, 其中'full'
表示用EM方式實現
雖然有很多引數,但是都已經給出了預設值。所以我們一般不需要去傳入這些引數,引數的。可以根據實際需要來呼叫。下面給一個簡單的例子:
import numpy as np
from sklearn.cluster import KMeans
data = np.random.rand(100, 3) #生成一個隨機資料,樣本大小為100, 特徵數為3
#假如我要構造一個聚類數為3的聚類器
estimator = KMeans(n_clusters=3)#構造聚類器
estimator.fit(data)#聚類
label_pred = estimator.label_ #獲取聚類標籤
centroids = estimator.cluster_centers_ #獲取聚類中心
inertia = estimator.inertia_ # 獲取聚類準則的最後值
直接採用kmeans函式:
import numpy as np
from sklearn import cluster
data = np.random.rand(100, 3) #生成一個隨機資料,樣本大小為100, 特徵數為3
k = 3 # 假如我要聚類為3個clusters
[centroid, label, inertia] = cluster.k_means(data, k)
當然其他方法也是類似,具體使用要參考API。(學會閱讀API,習慣去閱讀API)
classification
分類是資料探勘或者機器學習中最重要的一個部分。不過由於經典的分類方法機制比較特性化,所以好像sklearn並沒有特別定製一個分類器這樣的class。
常用的分類方法有:
- KNN最近鄰:
sklearn.neighbors
- logistic regression邏輯迴歸:
sklearn.linear_model.LogisticRegression
- svm支援向量機:
sklearn.svm
- Naive Bayes樸素貝葉斯:
sklearn.naive_bayes
- Decision Tree決策樹:
sklearn.tree
- Neural network神經網路:
sklearn.neural_network
那麼下面以KNN為例(主要是Nearest Neighbors Classification)來看看怎麼使用這些方法:
from sklearn import neighbors, datasets
# import some data to play with
iris = datasets.load_iris()
n_neighbors = 15
X = iris.data[:, :2] # we only take the first two features. We could
# avoid this ugly slicing by using a two-dim dataset
y = iris.target
weights = 'distance' # also set as 'uniform'
clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
clf.fit(X, y)
# if you have test data, just predict with the following functions
# for example, xx, yy is constructed test data
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) # Z is the label_pred
再比如svm:
from sklearn import svm
X = [[0, 0], [1, 1]]
y = [0, 1]
#建立支援向量分類模型
clf = svm.SVC()
#擬合訓練資料,得到訓練模型引數
clf.fit(X, y)
#對測試點[2., 2.], [3., 3.]預測
res = clf.predict([[2., 2.],[3., 3.]])
#輸出預測結果值
print res
#get support vectors
print "support vectors:", clf.support_vectors_
#get indices of support vectors
print "indices of support vectors:", clf.support_
#get number of support vectors for each class
print "number of support vectors for each class:", clf.n_support_
當然SVM還有對應的迴歸模型SVR
from sklearn import svm
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
clf = svm.SVR()
clf.fit(X, y)
res = clf.predict([[1, 1]])
print res
邏輯迴歸
from sklearn import linear_model
X = [[0, 0], [1, 1]]
y = [0, 1]
logreg = linear_model.LogisticRegression(C=1e5)
#we create an instance of Neighbours Classifier and fit the data.
logreg.fit(X, y)
res = logreg.predict([[2, 2]])
print res
preprocessing
這一塊通常我要用到的是Scale操作。而Scale型別也有很多,包括:
StandardScaler
MaxAbsScaler
MinMaxScaler
RobustScaler
Normalizer
- 等其他預處理操作
對應的有直接的函式使用:scale(), maxabs_scale(), minmax_scale(), robust_scale(), normaizer()
。
例如:
import numpy as np
from sklearn import preprocessing
X = np.random.rand(3,4)
#用scaler的方法
scaler = preprocessing.MinMaxScaler()
X_scaled = scaler.fit_transform(X)
#用scale函式的方法
X_scaled_convinent = preprocessing.minmax_scale(X)
decomposition
說一下NMF與PCA吧,這兩個比較常用。
import numpy as np
X = np.array([[1,1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])
from sklearn.decomposition import NMF
model = NMF(n_components=2, init='random', random_state=0)
model.fit(X)
print model.components_
print model.reconstruction_err_
print model.n_iter_
這裡說一下這個類下面fit()
與fit_transform()
的區別,前者僅訓練一個模型,沒有返回nmf後的分支,而後者除了訓練資料,並返回nmf後的分支。
PCA也是類似,只不過沒有那些初始化引數,如下:
import numpy as np
X = np.array([[1,1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])
from sklearn.decomposition import PCA
model = PCA(n_components=2)
model.fit(X)
print model.components_
print model.n_components_
print model.explained_variance_
print model.explained_variance_ratio_
print model.mean_
print model.noise_variance_
metrics
上述聚類分類任務,都需要最後的評估。
分類
比如分類,有下面常用評價指標與metrics:
accuracy_score
auc
f1_score
fbeta_score
hamming_loss
hinge_loss
jaccard_similarity_score
log_loss
recall_score
- …
下面例子求的是分類結果的準確率:
from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
ac = accuracy_score(y_true, y_pred)
print ac
ac2 = accuracy_score(y_true, y_pred, normalize=False)
print ac2
其他指標的使用類似。
迴歸
迴歸的相關metrics包含且不限於以下:
mean_absolute_error
mean_squared_error
median_absolute_error
- …
聚類
有以下常用評價指標(internal and external):
adjusted_mutual_info_score
adjusted_rand_score
completeness_score
homogeneity_score
normalized_mutual_info_score
silhouette_score
v_measure_score
- …
下面例子求的是聚類結果的NMI(標準互資訊),其他指標也類似。
from sklearn.metrics import normalized_mutual_info_score
y_pred = [0,0,1,1,2,2]
y_true = [1,1,2,2,3,3]
nmi = normalized_mutual_info_score(y_true, y_pred)
print nmi
當然除此之外還有更多其他的metrics。參考API。
datasets
sklearn本身也提供了幾個常見的資料集,如iris, diabetes, digits, covtype, kddcup99, boson, breast_cancer,都可以通過sklearn.datasets.load_iris類似的方法載入相應的資料集。它返回一個數據集。採用下列方式獲取資料與標籤。
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
除了這些公用的資料集外,datasets模組還提供了很多資料操作的函式,如load_files, load_svmlight_file,以及很多data generators。
panda.io還提供了很多可load外部資料(如csv, excel, json, sql等格式)的方法。
還可以獲取mldata這個repos上的資料集。
python的功能還是比較強大。
當然資料集的load也可以通過自己寫readfile函式來讀寫檔案。
結束語
上述主要學習了我比較常用的一些功能。當熟悉python後,只要閱讀Scikit-learn API,一切都不是問題。
另外有必要時,可檢視這些常用函式的原始碼學習,加深對資料探勘常用演算法原理的理解。