日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

[转载]Scikit Learn: 在python中机器学习

發(fā)布時間:2023/12/19 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载]Scikit Learn: 在python中机器学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原址:http://my.oschina.net/u/175377/blog/84420

目錄[-]

  • Scikit Learn: 在python中機(jī)器學(xué)習(xí)
  • 載入示例數(shù)據(jù)
  • 一個改變數(shù)據(jù)集大小的示例:數(shù)碼數(shù)據(jù)集(digits datasets)
  • 學(xué)習(xí)和預(yù)測
  • 分類
  • K最近鄰(KNN)分類器
  • 訓(xùn)練集和測試集
  • 分類支持向量機(jī)(SVMs)
  • 線性支持向量機(jī)
  • 使用核
  • 聚類:將觀測值聚合
  • k均值聚類
  • 應(yīng)用到圖像壓縮
  • 用主成分分析降維
  • 將一切放在一起:人臉識別
  • 線性模型:從回歸到稀疏
  • 稀疏模型
  • 同一問題的不同算法
  • 模型選擇:選擇估計(jì)器和它們的參數(shù)
  • 格點(diǎn)搜索和交叉驗(yàn)證估計(jì)器
  • 格點(diǎn)搜索
  • 交叉驗(yàn)證估計(jì)器
  • Footnotes

Scikit Learn: 在python中機(jī)器學(xué)習(xí)

Warning

警告:有些沒能理解的句子,我以自己的理解意譯。

翻譯自:Scikit Learn:Machine Learning in Python

作者: Fabian Pedregosa, Gael Varoquaux

先決條件

  • Numpy, Scipy
  • IPython
  • matplotlib
  • scikit-learn

目錄

    • ?載入示例數(shù)據(jù)
      • 一個改變數(shù)據(jù)集大小的示例:數(shù)碼數(shù)據(jù)集(digits datasets)
      • 學(xué)習(xí)和預(yù)測
    • 分類
      • K最近鄰(KNN)分類器
        • 訓(xùn)練集和測試集
      • 分類支持向量機(jī)(SVMs)
        • 線性支持向量機(jī)
        • 使用核
    • 聚類:將觀測值聚合
      • k均值聚類
        • 應(yīng)用到圖像壓縮
    • 用主成分分析降維
    • 將一切放在一起:人臉識別
    • 線性模型:從回歸到稀疏
      • 稀疏模型
        • 同一問題的不同算法
    • 模型選擇:選擇估計(jì)器和它們的參數(shù)
      • 格點(diǎn)搜索和交叉驗(yàn)證估計(jì)器
        • 格點(diǎn)搜索
        • 交叉驗(yàn)證估計(jì)器
    • Footnotes

警告:在0.9版中(2011年9月發(fā)行),scikit-learn的導(dǎo)入路徑從scikits.learn更改為sklearn

載入示例數(shù)據(jù)

首先我們載入一些用來玩耍的數(shù)據(jù)。我們將使用的數(shù)據(jù)是非常簡單的著名的花朵數(shù)據(jù)——安德森鳶尾花卉數(shù)據(jù)集。

我們有一百五十個鳶尾花的一些尺寸的觀測值:萼片長度、寬度,花瓣長度和寬度。還有它們的亞屬:山鳶尾(Iris setosa)、變色鳶尾(Iris versicolor)和維吉尼亞鳶尾(Iris virginica)

向python對象載入數(shù)據(jù):

In [1]: from sklearn import datasets In [2]: iris = datasets.load_iris()

數(shù)據(jù)存儲在.data項(xiàng)中,是一個(n_samples, n_features)數(shù)組。

In [3]: iris.data.shape Out[3]: (150, 4)

每個觀察對象的種類存貯在數(shù)據(jù)集的.target屬性中。這是一個長度為n_samples的整數(shù)一維數(shù)組:

In [5]: iris.target.shape Out[5]: (150,)In [6]: import numpy as npIn [7]: np.unique(iris.target) Out[7]: array([0, 1, 2])

一個改變數(shù)據(jù)集大小的示例:數(shù)碼數(shù)據(jù)集(digits datasets)

數(shù)碼數(shù)據(jù)集1包括1797個圖像,每一個都是個代表手寫數(shù)字的8x8像素圖像

In [8]: digits = datasets.load_digits()In [9]: digits.images.shape Out[9]: (1797, 8, 8)In [10]: import pylab as plIn [11]: pl.imshow(digits.images[0], cmap=pl.cm.gray_r) Out[11]: <matplotlib.image.AxesImage at 0x3285b90>In [13]: pl.show()

為了在scikit中使用這個數(shù)據(jù)集,我們把每個8x8圖像轉(zhuǎn)換成長度為64的矢量。(譯者注:或者直接用digits.data)

In [12]: data = digits.images.reshape((digits.images.shape[0], -1))

學(xué)習(xí)和預(yù)測

現(xiàn)在我們已經(jīng)獲得一些數(shù)據(jù),我們想要從中學(xué)習(xí)和預(yù)測一個新的數(shù)據(jù)。在scikit-learn中,我們通過創(chuàng)建一個估計(jì)器(estimator)從已經(jīng)存在的數(shù)據(jù)學(xué)習(xí),并且調(diào)用它的fit(X,Y)方法。

In [14]: from sklearn import svmIn [15]: clf = svm.LinearSVC()In [16]: clf.fit(iris.data, iris.target) # learn from the data Out[16]: LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,intercept_scaling=1, loss='l2', multi_class='ovr', penalty='l2',tol=0.0001, verbose=0)

一旦我們已經(jīng)從數(shù)據(jù)學(xué)習(xí),我們可以使用我們的模型來預(yù)測未觀測數(shù)據(jù)最可能的結(jié)果。

In [17]: clf.predict([[ 5.0, 3.6, 1.3, 0.25]]) Out[17]: array([0], dtype=int32)

注意:我們可以通過它以下劃線結(jié)束的屬性存取模型的參數(shù):

In [18]: clf.coef_ Out[18]: array([[ 0.18424352, 0.45122644, -0.8079467 , -0.45071302],[ 0.05190619, -0.89423619, 0.40519245, -0.93781587],[-0.85087844, -0.98667529, 1.38088883, 1.86538111]])

分類

K最近鄰(KNN)分類器

最簡單的可能的分類器是最近鄰:給定一個新的觀測值,將n維空間中最靠近它的訓(xùn)練樣本標(biāo)簽給它。其中n是每個樣本中特性(features)數(shù)。

k最近鄰2分類器內(nèi)部使用基于球樹(ball tree)3來代表它訓(xùn)練的樣本。

KNN分類示例

In [19]: # Create and fit a nearest-neighbor classifierIn [20]: from sklearn import neighborsIn [21]: knn = neighbors.KNeighborsClassifier()In [22]: knn.fit(iris.data, iris.target) Out[22]: KNeighborsClassifier(algorithm='auto', leaf_size=30, n_neighbors=5, p=2,warn_on_equidistant=True, weights='uniform')In [23]: knn.predict([[0.1, 0.2, 0.3, 0.4]]) Out[23]: array([0])

訓(xùn)練集和測試集

當(dāng)驗(yàn)證學(xué)習(xí)算法時,不要用一個用來擬合估計(jì)器的數(shù)據(jù)來驗(yàn)證估計(jì)器的預(yù)測非常重要。確實(shí),通過kNN估計(jì)器,我們將總是獲得關(guān)于訓(xùn)練集完美的預(yù)測。

In [24]: perm = np.random.permutation(iris.target.size)In [25]: iris.data = iris.data[perm]In [26]: iris.target = iris.target[perm]In [27]: knn.fit(iris.data[:100], iris.target[:100]) Out[27]: KNeighborsClassifier(algorithm='auto', leaf_size=30, n_neighbors=5, p=2,warn_on_equidistant=True, weights='uniform')In [28]: knn.score(iris.data[100:], iris.target[100:]) /usr/lib/python2.7/site-packages/sklearn/neighbors/classification.py:129: NeighborsWarning: kneighbors: neighbor k+1 and neighbor k have the same distance: results will be dependent on data order.neigh_dist, neigh_ind = self.kneighbors(X) Out[28]: 0.95999999999999996

Bonus的問題:為什么我們使用隨機(jī)的排列?

分類支持向量機(jī)(SVMs)

線性支持向量機(jī)

SVMs4嘗試構(gòu)建一個兩個類別的最大間隔超平面。它選擇輸入的子集,調(diào)用支持向量即離分離的超平面最近的樣本點(diǎn)。

In [60]: from sklearn import svmIn [61]: svc = svm.SVC(kernel='linear')In [62]: svc.fit(iris.data, iris.target) Out[62]: SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,kernel='linear', probability=False, shrinking=True, tol=0.001,verbose=False)

scikit-learn中有好幾種支持向量機(jī)實(shí)現(xiàn)。最普遍使用的是svm.SVC,svm.NuSVC和svm.LinearSVC;“SVC”代表支持向量分類器(Support Vector Classifier)(也存在回歸SVMs,在scikit-learn中叫作“SVR”)。

練習(xí)

訓(xùn)練一個數(shù)字?jǐn)?shù)據(jù)集的svm.SVC。省略最后10%并且檢驗(yàn)觀測值的預(yù)測表現(xiàn)。

使用核

類別不總是可以用超平面分離,所以人們指望有些可能是多項(xiàng)式或指數(shù)實(shí)例的非線性決策函數(shù):

  • 線性核

    svc = svm.SVC(kernel=’linear’)

  • 多項(xiàng)式核

    svc = svm.SVC(kernel=’poly’, … degree=3) # degree: polynomial degree

  • RBF核(徑向基函數(shù))5

    svc = svm.SVC(kernel=’rbf’) # gamma: inverse of size of # radial kernel

練習(xí)

以上提到的哪些核對數(shù)字?jǐn)?shù)據(jù)集有更好的預(yù)測性能?(譯者:前兩個)

聚類:將觀測值聚合

給定鳶尾花數(shù)據(jù)集,如果我們知道這有三種鳶尾花,但是無法得到它們的標(biāo)簽,我們可以嘗試非監(jiān)督學(xué)習(xí):我們可以通過某些標(biāo)準(zhǔn)聚類觀測值到幾個組別里。

k均值聚類

最簡答的聚類算法是k均值算法。這將一個數(shù)據(jù)分成k個集群,以最小化觀測值(n維空間中)到聚類中心的均值來分配每個觀測點(diǎn)到集群;然后均值重新被計(jì)算。這個操作遞歸運(yùn)行直到聚類收斂,在max_iter回合內(nèi)到最大值。6

(一個替代的k均值算法實(shí)現(xiàn)在scipy中的cluster包中。這個scikit-learn實(shí)現(xiàn)與之不同,通過提供對象API和幾個額外的特性,包括智能初始化。)

In [82]: from sklearn import cluster, datasetsIn [83]: iris = datasets.load_iris()In [84]: k_means = cluster.KMeans(k=3)In [85]: k_means.fit(iris.data) Out[85]: KMeans(copy_x=True, init='k-means++', k=3, max_iter=300, n_init=10, n_jobs=1,precompute_distances=True,random_state=<mtrand.RandomState object at 0x7f4d860642d0>, tol=0.0001,verbose=0)In [86]: print k_means.labels_[::10] [1 1 1 1 1 2 2 2 2 2 0 0 0 0 0]In [87]: print iris.target[::10] [0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]

應(yīng)用到圖像壓縮

譯者注:Lena是經(jīng)典的圖像處理實(shí)例圖像, 8位灰度色深, 尺寸512 x 512

聚類可以被看作是一種從信息中選擇一小部分觀測值。例如,這個可以被用來海報(bào)化一個圖像(將連續(xù)變化的色調(diào)轉(zhuǎn)換成更少幾個色調(diào)):

In [95]: from scipy import miscIn [96]: lena = misc.lena().astype(np.float32)In [97]: X = lena.reshape((-1, 1)) # We need an (n_sample, n_feature) arrayIn [98]: k_means = cluster.KMeans(5)In [99]: k_means.fit(X) Out[99]: KMeans(copy_x=True, init='k-means++', k=5, max_iter=300, n_init=10, n_jobs=1,precompute_distances=True,random_state=<mtrand.RandomState object at 0x7f4d860642d0>, tol=0.0001,verbose=0)In [100]: values = k_means.cluster_centers_.squeeze()In [101]: labels = k_means.labels_In [102]: lena_compressed = np.choose(labels, values)In [103]: lena_compressed.shape = lena.shape

譯者注:想看效果?

In [31]: import matplotlib.pyplot as pltIn [32]: plt.gray()In [33]: plt.imshow(lena_compressed) Out[33]: <matplotlib.image.AxesImage at 0x4b2c510>In [34]: plt.show()

原圖類似。

![Image]

用主成分分析降維

以上根據(jù)觀測值標(biāo)記的點(diǎn)云在一個方向非常平坦,所以一個特性幾乎可以用其它兩個確切地計(jì)算。PCA發(fā)現(xiàn)哪個方向的數(shù)據(jù)不是平的并且它可以通過在一個子空間投影來降維。

警告:PCA將在模塊decomposition或pca中,這取決于你scikit-learn的版本。

In [75]: from sklearn import decompositionIn [76]: pca = decomposition.PCA(n_components=2)In [77]: pca.fit(iris.data) Out[77]: PCA(copy=True, n_components=2, whiten=False)In [78]: X = pca.transform(iris.data)

現(xiàn)在我們可以可視化(降維過的)鳶尾花數(shù)據(jù)集:

In [79]: import pylab as plIn [80]: pl.scatter(X[:, 0], X[:, 1], c=iris.target) Out[80]: <matplotlib.collections.PathCollection at 0x4104310>

PCA不僅在可視化高維數(shù)據(jù)集時非常有用。它可以用來作為幫助加速對高維數(shù)據(jù)不那么有效率的監(jiān)督方法7的預(yù)處理步驟。

將一切放在一起:人臉識別

一個實(shí)例使用主成分分析來降維和支持向量機(jī)來分類進(jìn)行人臉識別。

譯者注:讓程序自動下載(確保聯(lián)網(wǎng),文件較大,要等待很久)或者手動下載數(shù)據(jù)并放到./scikit_learn_data/lfw_home/下。

""" Stripped-down version of the face recognition example by Olivier Griselhttp://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()

全部代碼:face.py

線性模型:從回歸到稀疏

糖尿病數(shù)據(jù)集

糖尿病數(shù)據(jù)集包含442個病人的測量而得的10項(xiàng)生理指標(biāo)(年齡,性別,體重,血壓),和一年后疾病進(jìn)展的指示:

In [104]: diabetes = datasets.load_diabetes()In [105]: diabetes_X_train = diabetes.data[:-20]In [106]: diabetes_X_test = diabetes.data[-20:]In [107]: diabetes_y_train = diabetes.target[:-20]In [108]: diabetes_y_test = diabetes.target[-20:]

這個手頭的任務(wù)是用來從生理指標(biāo)預(yù)測疾病。

稀疏模型

為了改善問題的條件(無信息變量,減少維度的不利影響,作為一個特性(feature)選擇的預(yù)處理,等等),我們只關(guān)注有信息的特性將沒有信息的特性設(shè)置為0.這個罰則函數(shù)法8,叫作套索(Lasso)9,可以將一些系數(shù)設(shè)置為0.這些方法叫作稀疏方法(sparse method),稀疏化可以被視作奧卡姆剃刀:相對于復(fù)雜模型更傾向于簡單的。

In [109]: from sklearn import linear_modelIn [110]: regr = linear_model.Lasso(alpha=.3)In [111]: regr.fit(diabetes_X_train, diabetes_y_train) Out[111]: Lasso(alpha=0.3, copy_X=True, fit_intercept=True, max_iter=1000,normalize=False, positive=False, precompute='auto', tol=0.0001,warm_start=False)In [112]: regr.coef_ # very sparse coefficients Out[112]: array([ 0. , -0. , 497.34075682, 199.17441034,-0. , -0. , -118.89291545, 0. ,430.9379595 , 0. ])In [113]: regr.score(diabetes_X_test, diabetes_y_test) Out[113]: 0.55108354530029791

這個分?jǐn)?shù)和線性回歸(最小二乘法)非常相似:

In [114]: lin = linear_model.LinearRegression()In [115]: lin.fit(diabetes_X_train, diabetes_y_train) Out[115]: LinearRegression(copy_X=True, fit_intercept=True, normalize=False)In [116]: lin.score(diabetes_X_test, diabetes_y_test) Out[116]: 0.58507530226905713

同一問題的不同算法

同一數(shù)學(xué)問題可以用不同算法解決。例如,sklearn中的Lasso對象使用坐標(biāo)下降(coordinate descent)方法10解決套索回歸,這在大數(shù)據(jù)集時非常有效率。然而,sklearn也提供了LassoLARS對象,使用LARS這種在解決權(quán)重向量估計(jì)非常稀疏,觀測值很少的問題很有效率的方法。

模型選擇:選擇估計(jì)器和它們的參數(shù)

格點(diǎn)搜索和交叉驗(yàn)證估計(jì)器

格點(diǎn)搜索

scikit-learn提供了一個對象,該對象給定數(shù)據(jù),在擬合一個參數(shù)網(wǎng)格的估計(jì)器時計(jì)算分?jǐn)?shù),并且選擇參數(shù)最大化交叉驗(yàn)證分?jǐn)?shù)。這個對象在構(gòu)建時采用一個估計(jì)器并且暴露一個估計(jì)器API:

In [117]: from sklearn import svm, grid_searchIn [118]: gammas = np.logspace(-6, -1, 10)In [119]: svc = svm.SVC()In [120]: clf = grid_search.GridSearchCV(estimator=svc, param_grid=dict(gamma=gammas),n_jobs=-1)In [121]: clf.fit(digits.data[:1000], digits.target[:1000]) Out[121]: GridSearchCV(cv=None,estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,kernel='rbf', probability=False, 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, verbose=0)In [122]: clf.best_score /usr/lib/python2.7/site-packages/sklearn/utils/__init__.py:79: DeprecationWarning: Function best_score is deprecated; GridSearchCV.best_score is deprecated and will be removed in version 0.12. Please use ``GridSearchCV.best_score_`` instead.warnings.warn(msg, category=DeprecationWarning) Out[122]: 0.98600097103091122In [123]: clf.best_estimator.gamma /usr/lib/python2.7/site-packages/sklearn/utils/__init__.py:79: DeprecationWarning: Function best_estimator is deprecated; GridSearchCV.best_estimator is deprecated and will be removed in version 0.12. Please use ``GridSearchCV.best_estimator_`` instead.warnings.warn(msg, category=DeprecationWarning) Out[123]: 0.0021544346900318843

默認(rèn)GridSearchCV使用三次(3-fold)交叉驗(yàn)證。然而,如果它探測到一個分類器被傳遞,而不是一個回歸量,它使用分層的3次。

交叉驗(yàn)證估計(jì)器

交叉驗(yàn)證在一個algorithm by algorithm基礎(chǔ)上可以更有效地設(shè)定參數(shù)。這就是為何,對給定的估計(jì)器,scikit-learn使用“CV”估計(jì)器,通過交叉驗(yàn)證自動設(shè)定參數(shù)。

In [125]: from sklearn import linear_model, datasetsIn [126]: lasso = linear_model.LassoCV()In [127]: diabetes = datasets.load_diabetes()In [128]: X_diabetes = diabetes.dataIn [129]: y_diabetes = diabetes.targetIn [130]: lasso.fit(X_diabetes, y_diabetes) Out[130]: LassoCV(alphas=array([ 2.14804, 2.00327, ..., 0.0023 , 0.00215]),copy_X=True, cv=None, eps=0.001, fit_intercept=True, max_iter=1000,n_alphas=100, normalize=False, precompute='auto', tol=0.0001,verbose=False)In [131]: # The estimator chose automatically its lambda:In [132]: lasso.alpha Out[132]: 0.013180196198701137

這些估計(jì)器是相似的,以‘CV’為它們名字的后綴。

練習(xí)

對糖尿病數(shù)據(jù)集,找到最優(yōu)的正則化參數(shù)alpha。(0.016249161908773888)

Footnotes

  • 什么手寫數(shù)字?jǐn)?shù)據(jù)集?

  • KNN分類算法?

  • Ball tree數(shù)據(jù)結(jié)構(gòu)?

  • 支持向量機(jī)?

  • 徑向基函數(shù)?

  • 看看wikipedia吧?

  • 監(jiān)督學(xué)習(xí)?

  • Penalty methods?

  • LASSO method?

  • Coordinate descent?

  • 轉(zhuǎn)載于:https://www.cnblogs.com/Scorpio989/p/4748308.html

    總結(jié)

    以上是生活随笔為你收集整理的[转载]Scikit Learn: 在python中机器学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。