【機(jī)器學(xué)習(xí)實(shí)驗(yàn)】scikit-learn的主要模塊和基本使用

【機(jī)器學(xué)習(xí)實(shí)驗(yàn)】scikit-learn的主要模塊和基本使用

引言

對于一些開始搞機(jī)器學(xué)習(xí)算法有害怕下手的小朋友,該如何快速入門,這讓人挺掙扎的。

在從事數(shù)據(jù)科學(xué)的人中,最常用的工具就是R和Python了,每個工具都有其利弊,但是Python在各方面都相對勝出一些,這是因?yàn)閟cikit-learn庫實(shí)現(xiàn)了很多機(jī)器學(xué)習(xí)算法。

加載數(shù)據(jù)(Data Loading)

我們假設(shè)輸入時一個特征矩陣或者csv文件。

首先,數(shù)據(jù)應(yīng)該被載入內(nèi)存中。

scikit-learn的實(shí)現(xiàn)使用了NumPy中的arrays,所以,我們要使用NumPy來載入csv文件。

以下是從UCI機(jī)器學(xué)習(xí)數(shù)據(jù)倉庫中下載的數(shù)據(jù)。

importnumpyasnpimporturllib# url with dataseturl ="http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"# download the fileraw_data = urllib.urlopen(url)# load the CSV file as a numpy matrixdataset = np.loadtxt(raw_data, delimiter=",")# separate the data from the target attributesX = dataset[:,0:7]y = dataset[:,8]

1

2

3

4

5

6

7

8

9

10

11

我們要使用該數(shù)據(jù)集作為例子,將特征矩陣作為X,目標(biāo)變量作為y。

數(shù)據(jù)歸一化(Data Normalization)

大多數(shù)機(jī)器學(xué)習(xí)算法中的梯度方法對于數(shù)據(jù)的縮放和尺度都是很敏感的,在開始跑算法之前,我們應(yīng)該進(jìn)行歸一化或者標(biāo)準(zhǔn)化的過程,這使得特征數(shù)據(jù)縮放到0-1范圍中。scikit-learn提供了歸一化的方法:

fromsklearnimportpreprocessing# normalize the data attributesnormalized_X = preprocessing.normalize(X)# standardize the data attributesstandardized_X = preprocessing.scale(X)

1

2

3

4

5

特征選擇(Feature Selection)

在解決一個實(shí)際問題的過程中,選擇合適的特征或者構(gòu)建特征的能力特別重要。這成為特征選擇或者特征工程。

特征選擇時一個很需要創(chuàng)造力的過程,更多的依賴于直覺和專業(yè)知識,并且有很多現(xiàn)成的算法來進(jìn)行特征的選擇。

下面的樹算法(Tree algorithms)計(jì)算特征的信息量:

fromsklearnimportmetricsfromsklearn.ensembleimportExtraTreesClassifiermodel = ExtraTreesClassifier()model.fit(X, y)# display the relative importance of each attributeprint(model.feature_importances_)

1

2

3

4

5

6

算法的使用

scikit-learn實(shí)現(xiàn)了機(jī)器學(xué)習(xí)的大部分基礎(chǔ)算法,讓我們快速了解一下。

邏輯回歸

大多數(shù)問題都可以歸結(jié)為二元分類問題。這個算法的優(yōu)點(diǎn)是可以給出數(shù)據(jù)所在類別的概率。

fromsklearnimportmetricsfromsklearn.linear_modelimportLogisticRegressionmodel = LogisticRegression()model.fit(X, y)print(model)# make predictionsexpected = ypredicted = model.predict(X)# summarize the fit of the modelprint(metrics.classification_report(expected, predicted))print(metrics.confusion_matrix(expected, predicted))

1

2

3

4

5

6

7

8

9

10

11

結(jié)果:

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,

intercept_scaling=1, penalty=l2, random_state=None, tol=0.0001)

precision recall f1-score support

0.0? ? ? 0.79? ? ? 0.89? ? ? 0.84? ? ? 500

1.0? ? ? 0.74? ? ? 0.55? ? ? 0.63? ? ? 268

avg / total 0.77 0.77 0.77 768

[[447 53]

[120 148]]

樸素貝葉斯

這也是著名的機(jī)器學(xué)習(xí)算法,該方法的任務(wù)是還原訓(xùn)練樣本數(shù)據(jù)的分布密度,其在多類別分類中有很好的效果。

fromsklearnimportmetricsfromsklearn.naive_bayesimportGaussianNBmodel = GaussianNB()model.fit(X, y)print(model)# make predictionsexpected = ypredicted = model.predict(X)# summarize the fit of the modelprint(metrics.classification_report(expected, predicted))print(metrics.confusion_matrix(expected, predicted))

1

2

3

4

5

6

7

8

9

10

11

結(jié)果:

GaussianNB()

precision recall f1-score support

0.0? ? ? 0.80? ? ? 0.86? ? ? 0.83? ? ? 500

1.0? ? ? 0.69? ? ? 0.60? ? ? 0.64? ? ? 268

avg / total 0.76 0.77 0.76 768

[[429 71]

[108 160]]

k近鄰

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

fromsklearnimportmetricsfromsklearn.neighborsimportKNeighborsClassifier# fit a k-nearest neighbor model to the datamodel = KNeighborsClassifier()model.fit(X, y)print(model)# make predictionsexpected = ypredicted = model.predict(X)# summarize the fit of the modelprint(metrics.classification_report(expected, predicted))print(metrics.confusion_matrix(expected, predicted))

1

2

3

4

5

6

7

8

9

10

11

12

結(jié)果:

KNeighborsClassifier(algorithm=auto, leaf_size=30, metric=minkowski,

n_neighbors=5, p=2, weights=uniform)

precision recall f1-score support

0.0? ? ? 0.82? ? ? 0.90? ? ? 0.86? ? ? 500

1.0? ? ? 0.77? ? ? 0.63? ? ? 0.69? ? ? 268

avg / total 0.80 0.80 0.80 768

[[448 52]

[ 98 170]]

決策樹

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

fromsklearnimportmetricsfromsklearn.treeimportDecisionTreeClassifier# fit a CART model to the datamodel = DecisionTreeClassifier()model.fit(X, y)print(model)# make predictionsexpected = ypredicted = model.predict(X)# summarize the fit of the modelprint(metrics.classification_report(expected, predicted))print(metrics.confusion_matrix(expected, predicted))

1

2

3

4

5

6

7

8

9

10

11

12

結(jié)果:

DecisionTreeClassifier(compute_importances=None, criterion=gini,

max_depth=None, max_features=None, min_density=None,

min_samples_leaf=1, min_samples_split=2, random_state=None,

splitter=best)

precision recall f1-score support

0.0? ? ? 1.00? ? ? 1.00? ? ? 1.00? ? ? 500

1.0? ? ? 1.00? ? ? 1.00? ? ? 1.00? ? ? 268

avg / total 1.00 1.00 1.00 768

[[500 0]

[ 0 268]]

支持向量機(jī)

SVM是非常流行的機(jī)器學(xué)習(xí)算法,主要用于分類問題,如同邏輯回歸問題,它可以使用一對多的方法進(jìn)行多類別的分類。

fromsklearnimportmetricsfromsklearn.svmimportSVC# fit a SVM model to the datamodel = SVC()model.fit(X, y)print(model)# make predictionsexpected = ypredicted = model.predict(X)# summarize the fit of the modelprint(metrics.classification_report(expected, predicted))print(metrics.confusion_matrix(expected, predicted))

1

2

3

4

5

6

7

8

9

10

11

12

結(jié)果:

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? ? ? 500

1.0? ? ? 1.00? ? ? 1.00? ? ? 1.00? ? ? 268

avg / total 1.00 1.00 1.00 768

[[500 0]

[ 0 268]]

除了分類和回歸算法外,scikit-learn提供了更加復(fù)雜的算法,比如聚類算法,還實(shí)現(xiàn)了算法組合的技術(shù),如Bagging和Boosting算法。

如何優(yōu)化算法參數(shù)

一項(xiàng)更加困難的任務(wù)是構(gòu)建一個有效的方法用于選擇正確的參數(shù),我們需要用搜索的方法來確定參數(shù)。scikit-learn提供了實(shí)現(xiàn)這一目標(biāo)的函數(shù)。

下面的例子是一個進(jìn)行正則參數(shù)選擇的程序:

importnumpyasnpfromsklearn.linear_modelimportRidgefromsklearn.grid_searchimportGridSearchCV# prepare a range of alpha values to testalphas = np.array([1,0.1,0.01,0.001,0.0001,0])# create and fit a ridge regression model, testing each alphamodel = Ridge()grid = GridSearchCV(estimator=model, param_grid=dict(alpha=alphas))grid.fit(X, y)print(grid)# summarize the results of the grid searchprint(grid.best_score_)print(grid.best_estimator_.alpha)

1

2

3

4

5

6

7

8

9

10

11

12

13

結(jié)果:

GridSearchCV(cv=None,

estimator=Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,

normalize=False, solver=auto, tol=0.001),

estimator__alpha=1.0, estimator__copy_X=True,

estimator__fit_intercept=True, estimator__max_iter=None,

estimator__normalize=False, estimator__solver=auto,

estimator__tol=0.001, fit_params={}, iid=True, loss_func=None,

n_jobs=1,

param_grid={‘a(chǎn)lpha’: 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)

0.282118955686

1.0

有時隨機(jī)從給定區(qū)間中選擇參數(shù)是很有效的方法,然后根據(jù)這些參數(shù)來評估算法的效果進(jìn)而選擇最佳的那個。

importnumpyasnpfromscipy.statsimportuniformassp_randfromsklearn.linear_modelimportRidgefromsklearn.grid_searchimportRandomizedSearchCV# prepare a uniform distribution to sample for the alpha parameterparam_grid = {'alpha': sp_rand()}# create and fit a ridge regression model, testing random alpha valuesmodel = Ridge()rsearch = RandomizedSearchCV(estimator=model, param_distributions=param_grid, n_iter=100)rsearch.fit(X, y)print(rsearch)# summarize the results of the random parameter searchprint(rsearch.best_score_)print(rsearch.best_estimator_.alpha)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

結(jié)果:

RandomizedSearchCV(cv=None,

estimator=Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,

normalize=False, solver=auto, tol=0.001),

estimator__alpha=1.0, estimator__copy_X=True,

estimator__fit_intercept=True, estimator__max_iter=None,

estimator__normalize=False, estimator__solver=auto,

estimator__tol=0.001, fit_params={}, iid=True, n_iter=100,

n_jobs=1,

param_distributions={‘a(chǎn)lpha’:

小結(jié)

我們總體了解了使用scikit-learn庫的大致流程,希望這些總結(jié)能讓初學(xué)者沉下心來,一步一步盡快的學(xué)習(xí)如何去解決具體的機(jī)器學(xué)習(xí)問題。

轉(zhuǎn)載請注明作者Jason Ding及其出處

GitCafe博客主頁(http://jasonding1354.gitcafe.io/)

Github博客主頁(http://jasonding1354.github.io/)

CSDN博客(http://blog.csdn.net/jasonding1354)

簡書主頁(http://m.itdecent.cn/users/2bd9b48f6ea8/latest_articles)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容