PythonとScikit-Learnによる機械学習の概要

こんにちは、Habr!







私の名前はAlexanderです 。私は、機械学習とWebグラフの分析( 主に理論的 )、およびBig Threeオペレーターの1つでのBig Data製品の開発に従事しています。 これは私の最初の投稿です-厳密に判断しないでください!)



最近、効率的なアルゴリズムの開発方法を学び、機械学習のコンテストに参加したい人が、「どこから始めればよいのか」という質問でますます頻繁に来ています。 少し前に、ロシア連邦政府の機関の1つでメディアとソーシャルネットワークを分析するためのビッグデータツールの開発を率いていましたが、チームをトレーニングして共有できる資料がまだ残っています。 読者は数学と機械学習に関する十分な知識を持っていると想定されます(チームは主にMIPT卒業生とデータ分析学部の学生で構成されていました)。



基本的に、これはデータサイエンスの紹介でした。 最近、この科学は非常に人気があります。 多くの場合、かなりの予算で、機械学習のコンテストが開催されています(たとえば、 KaggleTudedIT )。 この記事の目的は、読者に機械学習ツールの簡単な紹介を提供し、できるだけ早くコンテストに参加できるようにすることです。



現在利用可能な最も一般的なデータサイエンティストツールは、 RPythonです 。 各ツールには長所と短所がありますが、最近では、Pythonがあらゆる点で勝ちました(これはもっぱら両方を使用する著者の意見です)。 これ 、多数の機械学習アルゴリズムを実装した、十分に文書化されたScikit-Learnライブラリが登場した後に起こりました。



すぐに、記事では機械学習アルゴリズムに焦点を当てることに注意します。 通常、初期データ分析は、自分で対処できるPandasパッケージを使用するのが最適です。 したがって、明確にするために、入力にオブジェクト属性行列があり、 * .csv拡張子を持つファイルに保存されていると仮定して、実装に焦点を当てます



データの読み込み



まず、データをRAMにロードして、それらを操作できるようにする必要があります。 Scikit-Learnライブラリ自体は、NumPyの実装で配列を使用するため、NumPyを使用して* .csvファイルをロードします。 UCI Machine Learning Repositoryからデータセットの1つをダウンロードします



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





さらに、すべての例で、このデータセット、つまりオブジェクト属性行列Xとターゲット変数yの値を使用します。



データの正規化



ほとんどの勾配法(ほとんどすべての機械学習アルゴリズムが基本的に基づいている)は、データのスケーリングに非常に敏感であることを誰もがよく知っています。 したがって、アルゴリズムを開始する前に、 正規化またはいわゆる標準化が最も頻繁に行われます。 正規化では、各特徴が0〜1の範囲にあるように名目上の特徴の置換が行われます。標準化は、そのようなデータ前処理を意味します。その後、各特徴の平均は0、分散は1になります。



 from sklearn import preprocessing # normalize the data attributes normalized_X = preprocessing.normalize(X) # standardize the data attributes standardized_X = preprocessing.scale(X)
      
      







機能の選択



多くの場合、問題を解決する上で最も重要なことは、属性を正​​しく選択して作成することです。 英語の文献では、これは機能選択および機能エンジニアリングと呼ばれます。 フューチャーエンジニアリングは非常に創造的なプロセスであり、直観と専門知識に依存しますが、すでに、機能選択用の既製のアルゴリズムが多数あります。 「ウーディ」アルゴリズムにより、標識の情報内容を計算できます。



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





他のすべての方法は、構築されたモデルが最高の品質を提供する最適なサブセットを見つけるために、何らかの方法で属性のサブセットの効率的な列挙に基づいています。 そのような列挙アルゴリズムの1つは、Scikit-Learnライブラリでも利用可能な再帰的特徴除去アルゴリズムです。



 from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression model = LogisticRegression() # create the RFE model and select 3 attributes rfe = RFE(model, 3) rfe = rfe.fit(X, y) # summarize the selection of the attributes print(rfe.support_) print(rfe.ranking_)
      
      







アルゴリズム構築



既に述べたように、Scikit-Learnはすべての基本的な機械学習アルゴリズムを実装しています。 それらのいくつかを考えてみましょう。



ロジスティック回帰



分類問題(バイナリ)を解決するために最もよく使用されますが、マルチクラス分類も許可されます(いわゆるone-vs-allメソッド)。 このアルゴリズムの利点は、各オブジェクトの出力で、クラスに属する確率があることです。



 from sklearn import metrics from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X, y) print(model) # make predictions expected = y predicted = model.predict(X) # summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
      
      







ナイーブベイズ



また、最も有名な機械学習アルゴリズムの1つであり、その主なタスクはトレーニングサンプルのデータ密度を復元することです。 多くの場合、この方法は、正確にマルチクラス分類の問題に優れた品質を提供します。



 from sklearn import metrics from sklearn.naive_bayes import GaussianNB model = GaussianNB() model.fit(X, y) print(model) # make predictions expected = y predicted = model.predict(X) # summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
      
      







K最近傍



kNN(k-Nearest Neighbors)メソッドは、より複雑な分類アルゴリズムの一部としてよく使用されます。 たとえば、その評価はオブジェクトのサインとして使用できます。 また、適切に選択された属性に関する単純なkNNが優れた品質を提供する場合もあります。 パラメーター(主にメトリック)を正しく設定すると、多くの場合、アルゴリズムにより回帰問題の品質が向上します。



 from sklearn import metrics from sklearn.neighbors import KNeighborsClassifier # fit a k-nearest neighbor model to the data model = KNeighborsClassifier() model.fit(X, y) print(model) # make predictions expected = y predicted = model.predict(X) # summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
      
      







決定木



分類および回帰ツリー(CART)は、オブジェクトがカテゴリ属性を持つタスクでよく使用され、回帰および分類タスクに使用されます。 ツリーは、マルチクラス分類に非常に適しています。



 from sklearn import metrics from sklearn.tree import DecisionTreeClassifier # fit a CART model to the data model = DecisionTreeClassifier() model.fit(X, y) print(model) # make predictions expected = y predicted = model.predict(X) # summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
      
      







サポートベクター法



SVM(サポートベクターマシン)は、主に分類タスクに使用される最も有名な機械学習アルゴリズムの1つです。 ロジスティック回帰だけでなく、SVMではone-vs-allメソッドを使用したマルチクラス分類が可能です。



 from sklearn import metrics from sklearn.svm import SVC # fit a SVM model to the data model = SVC() model.fit(X, y) print(model) # make predictions expected = y predicted = model.predict(X) # summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
      
      





Scikit-Learnには、分類アルゴリズムと回帰アルゴリズムに加えて、クラスタリングなどの膨大な数のより複雑なアルゴリズムと、 バギングブースティングなどのアルゴリズム構成を構築するための実装された手法があります。



アルゴリズムパラメーターの最適化



真に効果的なアルゴリズムを構築する上で最も難しいステップの1つは、適切なパラメーターを選択することです。 通常、これは経験により容易になりますが、どういうわけかバストをしなければなりません。 幸いなことに、Scikit-Learnにはこのための多くの機能が既に実装されています。



たとえば、いくつかの値を順番に並べ替える正則化パラメーターの選択を見てみましょう。



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





特定のセグメントからパラメータをランダムに選択し、特定のパラメータを使用してアルゴリズムの品質を測定し、それによって最適なものを選択すると、何度も効果的になることがあります。



 import numpy as np from scipy.stats import uniform as sp_rand from sklearn.linear_model import Ridge from sklearn.grid_search import RandomizedSearchCV # prepare a uniform distribution to sample for the alpha parameter param_grid = {'alpha': sp_rand()} # create and fit a ridge regression model, testing random alpha values model = 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 search print(rsearch.best_score_) print(rsearch.best_estimator_.alpha)
      
      





Rと比較したPython(およびScikit-Learnライブラリ自体)の利点の1つは優れたドキュメントであるため、結果をファイルに出力することを除いて、Scikit-Learnライブラリを操作するプロセス全体を調べました。 次のパートでは、各セクションを詳細に検討します。特に、 Feauture Engineeringなどの重要な事項に触れます。



この資料が、初心者のデータサイエンティストが実際に機械学習の問題をできるだけ早く解決できるようになることを願っています。 結論として、私は機械学習競技会に参加し始めたばかりの人々の成功と忍耐を願っています!



All Articles