<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 3.6 scikit-learn:Python中的機器學習 In?[5]: ``` %matplotlib inline import numpy as np ``` > 作者: Fabian Pedregosa, Gael Varoquaux **先決條件** Numpy, Scipy IPython matplotlib scikit-learn ([http://scikit-learn.org](http://scikit-learn.org)) ![](http://scipy-lectures.github.io/_images/scikit-learn-logo.png) **章節內容** ``` 加載樣例數據集 - 學習與預測 分類 - KNN分類器 - 分類的支持向量機(SVMs) 聚類:將觀察值聚集在一起 - K-means聚類 使用主成分分析的降維 把所有都放在一起:面孔識別 線性模型:從回歸到簡約 - 簡約模型 模型選擇:選擇預測器和參數 - 網格搜索和交叉驗證預測器 ``` **警告**:從版本0.9(在2011年9月發布)起,scikit-learn導入路徑從scikits.learn 改為 sklearn ## 3.5.1 加載樣例數據集 ![](http://scipy-lectures.github.io/_images/Virginia_Iris.png) 首先,我們將加載一些數據來玩玩。我們將使用的數據是知名的非常簡單的花數據鳶尾花數據集。 我們有150個鳶尾花觀察值指定了一些測量:花萼寬帶、花萼長度、花瓣寬度和花瓣長度,以及對應的子類:Iris setosa、Iris versicolor和Iris virginica。 將數據集加載為Python對象: In?[1]: ``` from sklearn import datasets iris = datasets.load_iris() ``` 這個數據存儲在`.data`成員中,是一個 (n_samples, n_features) 數組。 In?[2]: ``` iris.data.shape ``` Out[2]: ``` (150, 4) ``` 每個觀察的類別存儲在數據集的`.target`屬性中。這是長度是n_samples的1D整型數組 : In?[3]: ``` iris.target.shape ``` Out[3]: ``` (150,) ``` In?[4]: ``` import numpy as np np.unique(iris.target) ``` Out[4]: ``` array([0, 1, 2]) ``` 數據重排的例子:digits 數據集 ![](http://scipy-lectures.github.io/_images/digits_first_image.png) digits 數據集包含1797 圖像,每一個是8X8像素的圖片,代表一個手寫的數字 In?[15]: ``` digits = datasets.load_digits() digits.images.shape ``` Out[15]: ``` (1797, 8, 8) ``` In?[8]: ``` import pylab as pl pl.imshow(digits.images[0], cmap=pl.cm.gray_r) ``` Out[8]: ``` <matplotlib.image.AxesImage at 0x109abd990> ``` ![](https://box.kancloud.cn/2016-03-21_56efdc0c4254e.png) 要在scikit使用這個數據集,我們將每個8X8圖片轉化為一個長度為64的向量 In?[9]: ``` data = digits.images.reshape((digits.images.shape[0], -1)) ``` ### 3.5.1.1 學習和預測 現在我們有了一些數據,我們想要從上面學習并且在新的數據做預測。在scikit-learn中,我們通過創建一個預測器,并調用他的 fit(X, Y) 方法從現有數據上學習。 In?[11]: ``` from sklearn import svm clf = svm.LinearSVC() clf.fit(iris.data, iris.target) # 從數據學習 ``` Out[11]: ``` LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True, intercept_scaling=1, loss='squared_hinge', max_iter=1000, multi_class='ovr', penalty='l2', random_state=None, tol=0.0001, verbose=0) ``` 一旦我們從數據中學習,我們可以用我們的模型來預測未見過的數據的最可能輸出: In?[12]: ``` clf.predict([[ 5.0, 3.6, 1.3, 0.25]]) ``` Out[12]: ``` array([0]) ``` **注意**:我們可以通過由下滑線結尾的屬性來訪問模型的參數: In?[13]: ``` clf.coef_ ``` Out[13]: ``` array([[ 0.18424728, 0.45122657, -0.80794162, -0.45070597], [ 0.05691797, -0.89245895, 0.39682582, -0.92882381], [-0.85072494, -0.98678239, 1.38091241, 1.86550868]]) ``` ## 3.5.2 分類 ### 3.5.2.1 KNN分類器 ![](http://scipy-lectures.github.io/_images/iris_knn.png) 可能最簡單的分類器是最接近的鄰居: 給定一個觀察,使用在N維空間中訓練樣例中最接近它標簽,這里N是每個樣例的特征數。 K個最臨近的鄰居分類器內部使用基于ball tree的算法,用來代表訓練的樣例。 **KNN (K個最臨近鄰居) 分類的例子:** In?[14]: ``` # 創建并擬合一個最臨近鄰居分類器 from sklearn import neighbors knn = neighbors.KNeighborsClassifier() knn.fit(iris.data, iris.target) ``` Out[14]: ``` KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_neighbors=5, p=2, weights='uniform') ``` In?[15]: ``` knn.predict([[0.1, 0.2, 0.3, 0.4]]) ``` Out[15]: ``` array([0]) ``` **訓練集和測試集** 當用學習算法進行實驗時,重要的一點是不要用擬合預測器的數據來測試預測器的預測力。實際上,我們通常會在測試集上得到準確的預測。 In?[16]: ``` perm = np.random.permutation(iris.target.size) iris.data = iris.data[perm] iris.target = iris.target[perm] knn.fit(iris.data[:100], iris.target[:100]) ``` Out[16]: ``` KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_neighbors=5, p=2, weights='uniform') ``` In?[17]: ``` knn.score(iris.data[100:], iris.target[100:]) ``` Out[17]: ``` 0.95999999999999996 ``` 額外的問題: 為什么我們使用隨機排列? ### 3.5.2.2 分類的支持向量機 (SVMs)) #### 3.5.2.2.1 線性支持向量機 ![](http://scipy-lectures.github.io/_images/svm_margin.png) SVMs試圖構建一個最大化兩個類的間距的超平面。它選取輸入的一個子集,稱為支持向量,這個子集中的觀察距離分隔超平面最近。 In?[18]: ``` from sklearn import svm svc = svm.SVC(kernel='linear') svc.fit(iris.data, iris.target) ``` Out[18]: ``` SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='linear', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False) ``` 在scikit-learn實現了幾種支持向量機。最常用的是`svm.SVC`、`svm.NuSVC` 和 `svm.LinearSVC`; “SVC” 代表支持向量分類器 (也存在用于回歸的SVMs, 在scikit-learn被稱為“SVR”)。 **練習** 在digits數據集上訓練`svm.SVC`。留下最后的10%,在這些觀察上測試預測的效果。 #### 3.5.2.2.2 使用核 (kernel)) 類通常并不是都能用超平面分隔,因此,有一個不僅僅是線性也可能是多項式或者冪的決策函數是明智的 : **線性核 (kernel)** ![](http://scipy-lectures.github.io/_images/svm_kernel_linear.png) In?[19]: ``` svc = svm.SVC(kernel='linear') ``` **多項式核 (kernel)** ![](http://scipy-lectures.github.io/_images/svm_kernel_poly.png) In?[20]: ``` svc = svm.SVC(kernel='poly', degree=3) # degree: 多項式的階 ``` **RBF核 (kernel) (徑向基核函數)** ![](http://scipy-lectures.github.io/_images/svm_kernel_rbf.png) In?[21]: ``` svc = svm.SVC(kernel='rbf') # gamma: 徑向基核大小的倒數 ``` **練習** 以上列出的核哪一個在digits數據集上有較好的預測表現? ## 3.5.3 聚類 : 將觀察值分組 以鳶尾花 (iris) 數據集為例,如果有三類鳶尾花,但是并不能訪問他們標簽,我們可以嘗試**非觀察學習** : 通過一些標準將觀察**聚類**分入一些組。 ### 3.5.3.1 K-means 聚類 最簡單的聚類算法是k-means。這個算法將集合分成k個組,將每個觀察值分配給一個組,以便使觀察值 (在n維空間) 到組平均值的距離最小;然后重新計算平均數。循環進行這個操作直到組收斂,比如達到最大的`max_iter`循環次數。 (k-means的另一個實現在SciPy的`cluster`包中。`scikit-learn`實現的不同在于提供了一個對象API和一些額外的功能,包括智能初始化。) In?[2]: ``` from sklearn import cluster, datasets iris = datasets.load_iris() k_means = cluster.KMeans(n_clusters=3) k_means.fit(iris.data) ``` Out[2]: ``` KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=3, n_init=10, n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001, verbose=0) ``` In?[25]: ``` print k_means.labels_[::10] ``` ``` [0 0 0 0 0 1 1 1 1 1 2 2 2 2 2] ``` In?[26]: ``` print iris.target[::10] ``` ``` [0 0 0 0 0 1 1 1 1 1 2 2 2 2 2] ``` **真實情況** ![](http://scipy-lectures.github.io/_images/cluster_iris_truth.png) **K-means (3 組)** ![](http://scipy-lectures.github.io/_images/k_means_iris_3.png) **K-means (8 組)** ![](http://scipy-lectures.github.io/_images/k_means_iris_8.png) **在圖像壓縮中的應用** 聚類可以看做從信息中選取一組觀察的方式。例如,這個技術可以被用來posterize一個圖像 (將連續漸變色調轉換為更少色調的一些區域): In?[5]: ``` from scipy import misc lena = misc.lena().astype(np.float32) X = lena.reshape((-1, 1)) # We need an (n_sample, n_feature) array k_means = cluster.KMeans(n_clusters=5) k_means.fit(X) ``` Out[5]: ``` KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=5, n_init=10, n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001, verbose=0) ``` In?[6]: ``` values = k_means.cluster_centers_.squeeze() labels = k_means.labels_ lena_compressed = np.choose(labels, values) lena_compressed.shape = lena.shape ``` 源圖片 ![](http://scipy-lectures.github.io/_images/lena1.png) K-means quantization ![](http://scipy-lectures.github.io/_images/lena_compressed.png) ## 3.5.4 使用主成分分析的降維 ![](http://scipy-lectures.github.io/_images/pca_3d_axis.jpg) ![](http://scipy-lectures.github.io/_images/pca_3d_aligned.jpg) 上面觀察展開的云點在一個方向非常平坦,因此,一個特征幾乎可以準確用另兩個特征來計算。PCA找到數據并不平坦的方向,并且可以通過投影到一個子空間中來減少維度。 **警告**: 根據你的scikit-learn版本,PCA將在模塊`decomposition`或`pca`中。 In?[3]: ``` from sklearn import decomposition pca = decomposition.PCA(n_components=2) pca.fit(iris.data) ``` Out[3]: ``` PCA(copy=True, n_components=2, whiten=False) ``` In?[4]: ``` X = pca.transform(iris.data) ``` 現在我們可視化(轉換的)鳶尾花數據集: In?[6]: ``` import pylab as pl pl.scatter(X[:, 0], X[:, 1], c=iris.target) ``` Out[6]: ``` <matplotlib.collections.PathCollection at 0x107502b90> ``` ![](https://box.kancloud.cn/2016-03-21_56efdc0c57846.png) PCA并不僅僅在高緯度數據集的可視化上有用。它也可以用于幫助加速對高維不太高效的有監督方法的預處理步驟。 ## 3.5.5 把所有的東西放在一起: 面孔識別 展示使用主成分分析來降維和用執行向量機分類的面孔識別的例子。 ![](http://scipy-lectures.github.io/_images/faces.png) In?[?]: ``` """ Stripped-down version of the face recognition example by Olivier Grisel http://scikit-learn.org/dev/auto_examples/applications/face_recognition.html ## original shape of images: 50, 37 """ import numpy as np import pylab as pl from sklearn import cross_val, datasets, decomposition, svm # .. # .. load data .. lfw_people = datasets.fetch_lfw_people(min_faces_per_person=70, resize=0.4) perm = np.random.permutation(lfw_people.target.size) lfw_people.data = lfw_people.data[perm] lfw_people.target = lfw_people.target[perm] faces = np.reshape(lfw_people.data, (lfw_people.target.shape[0], -1)) train, test = iter(cross_val.StratifiedKFold(lfw_people.target, k=4)).next() X_train, X_test = faces[train], faces[test] y_train, y_test = lfw_people.target[train], lfw_people.target[test] # .. # .. dimension reduction .. pca = decomposition.RandomizedPCA(n_components=150, whiten=True) pca.fit(X_train) X_train_pca = pca.transform(X_train) X_test_pca = pca.transform(X_test) # .. # .. classification .. clf = svm.SVC(C=5., gamma=0.001) clf.fit(X_train_pca, y_train) # .. # .. predict on new images .. for i in range(10): print lfw_people.target_names[clf.predict(X_test_pca[i])[0]] _ = pl.imshow(X_test[i].reshape(50, 37), cmap=pl.cm.gray) _ = raw_input() ``` 完整代碼: [faces.py](http://scipy-lectures.github.io/_downloads/faces.py) ## 3.5.6 線性模型: 從回歸到簡約 **糖尿病數據集** 糖尿病數據集包含442個病人測量的10個生理學變量 (年齡、性別、體重、血壓),以及一個一年后病情發展的標記: In?[8]: ``` diabetes = datasets.load_diabetes() diabetes_X_train = diabetes.data[:-20] diabetes_X_test = diabetes.data[-20:] diabetes_y_train = diabetes.target[:-20] diabetes_y_test = diabetes.target[-20:] ``` 目前的任務是從生理學變量中預測疾病發生。 ### 3.5.6.1 簡約模型 要改善問題的條件 (信息量小的變量、減少高緯度的詛咒、作為一個特征預處理等等), 僅選擇信息量大的特征,并且將沒有信息量的特征設置為0將非常有趣。這種懲罰手段,稱為**Lasso**, 可以將一些系數設置為0。這個方法稱為**簡約方法**,簡約性可以看做是Occam剃刀的一個應用: 相比于復雜的模型更偏好簡單的模型。 In?[9]: ``` from sklearn import linear_model regr = linear_model.Lasso(alpha=.3) regr.fit(diabetes_X_train, diabetes_y_train) ``` Out[9]: ``` Lasso(alpha=0.3, copy_X=True, fit_intercept=True, max_iter=1000, normalize=False, positive=False, precompute=False, random_state=None, selection='cyclic', tol=0.0001, warm_start=False) ``` In?[10]: ``` regr.coef_ # 非常簡約的系數 ``` Out[10]: ``` array([ 0\. , -0\. , 497.34075682, 199.17441034, -0\. , -0\. , -118.89291545, 0\. , 430.9379595 , 0\. ]) ``` In?[11]: ``` regr.score(diabetes_X_test, diabetes_y_test) ``` Out[11]: ``` 0.55108354530029779 ``` 分數與線性回歸 (最小二乘) 很相似: In?[12]: ``` lin = linear_model.LinearRegression() lin.fit(diabetes_X_train, diabetes_y_train) ``` Out[12]: ``` LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False) ``` In?[13]: ``` lin.score(diabetes_X_test, diabetes_y_test) ``` Out[13]: ``` 0.58507530226905713 ``` **相同問題的不同算法** 不同的算法可以用于解決相同的數學問題。例如,_sklearn_中的Lasso對象用_坐標下降法_來解lasso回歸,這種方法在大數據集上有效。但是,_sklearn_也提供了_LassoLARS_對象,使用_LARS_,一種在權重向量估計非常稀疏的問題上非常高效的方法,即有很少觀察值的問題。 ## 3.5.7 模型選擇: 選擇預測器及其參數 ### 3.5.7.1 網格搜索和交叉驗證預測器 #### 3.5.7.1.1 網格搜索 scikit-learn提供了一個對象,給定數據,計算預測器在一個參數網格的分數,并且選擇可以最大化交叉驗證分數的參數。這個對象用一個構建中的預測器并且暴露了一個預測器的探索集API: In?[16]: ``` from sklearn import svm, grid_search gammas = np.logspace(-6, -1, 10) svc = svm.SVC() clf = grid_search.GridSearchCV(estimator=svc, param_grid=dict(gamma=gammas), n_jobs=-1) clf.fit(digits.data[:1000], digits.target[:1000]) ``` Out[16]: ``` GridSearchCV(cv=None, error_score='raise', estimator=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), fit_params={}, iid=True, loss_func=None, n_jobs=-1, param_grid={'gamma': array([ 1.00000e-06, 3.59381e-06, 1.29155e-05, 4.64159e-05, 1.66810e-04, 5.99484e-04, 2.15443e-03, 7.74264e-03, 2.78256e-02, 1.00000e-01])}, pre_dispatch='2*n_jobs', refit=True, score_func=None, scoring=None, verbose=0) ``` In?[20]: ``` clf.best_score_ ``` Out[20]: ``` 0.93200000000000005 ``` In?[22]: ``` clf.best_estimator_.gamma ``` Out[22]: ``` 0.00059948425031894088 ``` 默認,_GridSearchCV_使用三折交叉驗證。但是,如果識別傳遞了一個分類器都不是一個回歸器,它將使用一個分層三折。 #### 3.5.7.1.2 交叉驗證預測器 一個算法一個算法為基礎的設置參數來進行交叉驗證更有效。這也就是為什么,對于一些預測器,scikit-learn暴露一個“CV”預測器, 這個預測器通過交叉驗證自動設置他們的參數: In?[23]: ``` from sklearn import linear_model, datasets lasso = linear_model.LassoCV() diabetes = datasets.load_diabetes() X_diabetes = diabetes.data y_diabetes = diabetes.target lasso.fit(X_diabetes, y_diabetes) ``` Out[23]: ``` LassoCV(alphas=None, copy_X=True, cv=None, eps=0.001, fit_intercept=True, max_iter=1000, n_alphas=100, n_jobs=1, normalize=False, positive=False, precompute='auto', random_state=None, selection='cyclic', tol=0.0001, verbose=False) ``` In?[26]: ``` # 預測器自動選擇他的lambda: lasso.alpha_ ``` Out[26]: ``` 0.012291895087486173 ``` 這些預測器與他們的對等物調用方式類似,只是在名字后面增加了‘CV’。 **練習** 在糖尿病數據集中,找到最優化的正則化參數alpha。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看