Python中常用包——sklearn主要模塊和基本使用方法


在從事數據科學的人中,最常用的工具就是R和Python了,每個工具都有其利弊,但是Python在各方面都相對勝出一些,這是因為scikit-learn庫實現了很多機器學習算法。 
加載數據(Data Loading)

我們假設輸入時一個特征矩陣或者csv文件。 
首先,數據應該被載入內存中。 
scikit-learn的實現使用了NumPy中的arrays,所以,我們要使用NumPy來載入csv文件。 
以下是從UCI機器學習數據倉庫中下載的數據。 
樣例:

1 import numpy as np 2 import urllib 3 # url with dataset 4 url = "http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data" 5 # download the file 6 raw_data = urllib.urlopen(url) 7 # load the CSV file as a numpy matrix 8 dataset = np.loadtxt(raw_data, delimiter=",") 9 # separate the data from the target attributes 10 X = dataset[:,0:7] 11 y = dataset[:,8]

我們要使用該數據集作為例子,將特征矩陣作為X,目標變量作為y。 

注意事項: 
(1)可以用瀏覽器打開那個url,把數據文件保存在本地,然后直接用 np.loadtxt(‘data.txt’, delemiter=”,”) 就可以加載數據了; 
(2)X = dataset[:, 0:7]的意思是:把dataset中的所有行,所有1-7列的數據都保存在X中;

數據歸一化(Data Normalization) 
大多數機器學習算法中的梯度方法對於數據的縮放和尺度都是很敏感的,在開始跑算法之前,我們應該進行歸一化或者標准化的過程,這使得特征數據縮放到0-1范圍中。scikit-learn提供了歸一化的方法,具體解釋參考http://scikit-learn.org/stable/modules/preprocessing.html: 
樣例:

1 from sklearn import preprocessing 2 #scale the data attributes 3 scaled_X = preprocessing.scale(X) 4 5 # normalize the data attributes 6 normalized_X = preprocessing.normalize(X) 7 8 # standardize the data attributes 9 standardized_X = preprocessing.scale(X)

 

特征選擇(Feature Selection)

在解決一個實際問題的過程中,選擇合適的特征或者構建特征的能力特別重要。這成為特征選擇或者特征工程。 
特征選擇時一個很需要創造力的過程,更多的依賴於直覺和專業知識,並且有很多現成的算法來進行特征的選擇。 
下面的樹算法(Tree algorithms)計算特征的信息量:

樣例:

1 from sklearn import metrics 2 from sklearn.ensemble import ExtraTreesClassifier 3 model = ExtraTreesClassifier() 4 model.fit(X, y) 5 # display the relative importance of each attribute 6 print(model.feature_importances_) 

 

輸出每個特征的重要程度:

[ 0.13784722 0.15383598 0.25451389 0.17476852 0.02847222 0.12314815 0.12741402]

算法的使用 
scikit-learn實現了機器學習的大部分基礎算法,讓我們快速了解一下。

邏輯回歸官方文檔

大多數問題都可以歸結為二元分類問題。這個算法的優點是可以給出數據所在類別的概率。 
樣例:

 1 from sklearn import metrics 2 from sklearn.linear_model import LogisticRegression 3 model = LogisticRegression() 4 model.fit(X, y) 5 print('MODEL') 6 print(model) 7 # make predictions 8 expected = y 9 predicted = model.predict(X) 10 # summarize the fit of the model 11 print('RESULT') 12 print(metrics.classification_report(expected, predicted)) 13 print('CONFUSION MATRIX') 14 print(metrics.confusion_matrix(expected, predicted))

結果:

1 MODEL 2 LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, 3 intercept_scaling=1, max_iter=100, multi_class='ovr', 4 penalty='l2', random_state=None, solver='liblinear', tol=0.0001, 5 verbose=0) 6 RESULT 7 precision recall f1-score support 8 9 0.0 1.00 1.00 1.00 4 10 1.0 1.00 1.00 1.00 6 11 12 avg / total 1.00 1.00 1.00 10 13 14 CONFUSION MATRIX 15 [[4 0] 16 [0 6]]

 

輸出結果中的各個參數信息,可以參考官方文檔。

朴素貝葉斯官方文檔

這也是著名的機器學習算法,該方法的任務是還原訓練樣本數據的分布密度,其在多類別分類中有很好的效果。 
樣例:

 1 from sklearn import metrics 2 from sklearn.naive_bayes import GaussianNB 3 model = GaussianNB() 4 model.fit(X, y) 5 print('MODEL') 6 print(model) 7 # make predictions 8 expected = y 9 predicted = model.predict(X) 10 # summarize the fit of the model 11 print('RESULT') 12 print(metrics.classification_report(expected, predicted)) 13 print('CONFUSION MATRIX') 14 print(metrics.confusion_matrix(expected, predicted))

結果:

MODEL
GaussianNB()
RESULT
             precision    recall  f1-score   support

        0.0 0.80 1.00 0.89 4 1.0 1.00 0.83 0.91 6 avg / total 0.92 0.90 0.90 10 CONFUSION MATRIX [[4 0] [1 5]]

k近鄰官方文檔

k近鄰算法常常被用作是分類算法一部分,比如可以用它來評估特征,在特征選擇上我們可以用到它。 
樣例:

 1 from sklearn import metrics 2 from sklearn.neighbors import KNeighborsClassifier 3 # fit a k-nearest neighbor model to the data 4 model = KNeighborsClassifier() 5 model.fit(X, y) 6 print(model) 7 # make predictions 8 expected = y 9 predicted = model.predict(X) 10 # summarize the fit of the model 11 print(metrics.classification_report(expected, predicted)) 12 print(metrics.confusion_matrix(expected, predicted))

結果:

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_neighbors=5, p=2, weights='uniform') precision recall f1-score support 0.0 0.75 0.75 0.75 4 1.0 0.83 0.83 0.83 6 avg / total 0.80 0.80 0.80 10 [[3 1] [1 5]]

決策樹官方文檔)

分類與回歸樹(Classification and Regression Trees ,CART)算法常用於特征含有類別信息的分類或者回歸問題,這種方法非常適用於多分類情況。 
樣例:

1 from sklearn import metrics 2 from sklearn.tree import DecisionTreeClassifier 3 # fit a CART model to the data 4 model = DecisionTreeClassifier() 5 model.fit(X, y) 6 print(model) 7 # make predictions 8 expected = y 9 predicted = model.predict(X) 10 # summarize the fit of the model 11 print(metrics.classification_report(expected, predicted)) 12 print(metrics.confusion_matrix(expected, predicted))

 

樣例:

DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None, max_features=None, max_leaf_nodes=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, random_state=None, splitter='best') precision recall f1-score support 0.0 1.00 1.00 1.00 4 1.0 1.00 1.00 1.00 6 avg / total 1.00 1.00 1.00 10 [[4 0] [0 6]]

 

支持向量機官方文檔

SVM是非常流行的機器學習算法,主要用於分類問題,如同邏輯回歸問題,它可以使用一對多的方法進行多類別的分類。 
樣例:

1 from sklearn import metrics 2 from sklearn.svm import SVC 3 # fit a SVM model to the data 4 model = SVC() 5 model.fit(X, y) 6 print(model) 7 # make predictions 8 expected = y 9 predicted = model.predict(X) 10 # summarize the fit of the model 11 print(metrics.classification_report(expected, predicted)) 12 print(metrics.confusion_matrix(expected, predicted))

結果

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False) precision recall f1-score support 0.0 1.00 1.00 1.00 4 1.0 1.00 1.00 1.00 6 avg / total 1.00 1.00 1.00 10 [[4 0] [0 6]]

 

除了分類和回歸算法外,scikit-learn提供了更加復雜的算法,比如聚類算法,還實現了算法組合的技術,如Bagging和Boosting算法。

如何優化算法參數 
一項更加困難的任務是構建一個有效的方法用於選擇正確的參數,我們需要用搜索的方法來確定參數。scikit-learn提供了實現這一目標的函數。 
下面的例子是一個進行正則參數選擇的程序: 
GridSearchCV官方文檔1(模塊使用) 官方文檔2(原理詳解) 
樣例:

1 import numpy as np 2 from sklearn.linear_model import Ridge 3 from sklearn.grid_search import GridSearchCV 4 # prepare a range of alpha values to test 5 alphas = np.array([1,0.1,0.01,0.001,0.0001,0]) 6 # create and fit a ridge regression model, testing each alpha 7 model = Ridge() 8 grid = GridSearchCV(estimator=model, param_grid=dict(alpha=alphas)) 9 grid.fit(X, y) 10 print(grid) 11 # summarize the results of the grid search 12 print(grid.best_score_) 13 print(grid.best_estimator_.alpha)

結果:

GridSearchCV(cv=None, error_score='raise', estimator=Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None, normalize=False, solver='auto', tol=0.001), fit_params={}, iid=True, loss_func=None, n_jobs=1, param_grid={'alpha': array([ 1.00000e+00, 1.00000e-01, 1.00000e-02, 1.00000e-03, 1.00000e-04, 0.00000e+00])}, pre_dispatch='2*n_jobs', refit=True, score_func=None, scoring=None, verbose=0) -5.59572064238 0.0

有時隨機從給定區間中選擇參數是很有效的方法,然后根據這些參數來評估算法的效果進而選擇最佳的那個。

RandomizedSearchCV官方文檔(模塊使用)官方文檔2 (原理詳解) 
樣例:

 1 import numpy as np 2 from scipy.stats import uniform as sp_rand 3 from sklearn.linear_model import Ridge 4 from sklearn.grid_search import RandomizedSearchCV 5 # prepare a uniform distribution to sample for the alpha parameter 6 param_grid = {'alpha': sp_rand()} 7 # create and fit a ridge regression model, testing random alpha values 8 model = Ridge() 9 rsearch = RandomizedSearchCV(estimator=model, param_distributions=param_grid, n_iter=100) 10 rsearch.fit(X, y) 11 print(rsearch) 12 # summarize the results of the random parameter search 13 print(rsearch.best_score_) 14 print(rsearch.best_estimator_.alpha)

參考文獻:http://www.jianshu.com/p/1c6efdbce226 
http://www.cnblogs.com/CheeseZH/p/5250997.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM