ホームページ >バックエンド開発 >Python チュートリアル >Python と Scikit-Learn を使用した機械学習の探索の詳細な説明
この記事は主に Python と Scikit-Learn に基づいた機械学習の探索に関する関連コンテンツを紹介しています。編集者は、学習や必要な友人の参照のためにここで共有します。
こんにちは、%username%!
私の名前は Alex です。機械学習とネットワーク グラフ分析 (主に理論) の経験があります。私はロシアの携帯電話会社向けのビッグデータ製品も開発していました。ネットで記事を書くのは初めてなので、嫌な方はコメントしないでください。
現在、多くの人が効率的なアルゴリズムを開発し、機械学習のコンテストに参加したいと考えています。そこで彼らは私のところに来て、「どうやって始めればいいですか?」と尋ねます。少し前、私はロシア政府関連機関でメディアやソーシャルネットワーク向けのビッグデータ分析ツールの開発を指揮しました。私のチームが使用しているドキュメントがまだいくつかありますので、ぜひ共有したいと思います。前提条件は、読者が数学と機械学習についてすでに十分な知識を持っていることです (私のチームは主に MIPT (モスクワ物理工科大学) とデータ分析学部の卒業生で構成されています)。
この記事はデータサイエンスについての紹介です。このテーマは最近非常に人気があります。機械学習コンテスト (Kaggle、TudedIT など) の数も増えており、通常、その資金は多額です。
R と Python は、データ サイエンティストが最もよく使用するツールの 2 つです。各ツールには長所と短所がありますが、最近では Python があらゆる面で勝っています (両方を使用しているにもかかわらず、私の謙虚な意見にすぎません)。これらすべては、完全なドキュメントと豊富な機械学習アルゴリズムを含む Scikit-Learn ライブラリの出現によって起こりました。
この記事では主に機械学習アルゴリズムについて説明します。通常、マスター データ分析を実行するには Pandas パッケージを使用する方が適切であり、自分で行うのも簡単です。したがって、実装に焦点を当てましょう。確実性を高めるために、入力としてフィーチャオブジェクト マトリックスがあり、それが *.csv ファイルに保存されていると仮定します。
データのロード
まず、データを操作する前に、データをメモリにロードする必要があります。 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 の分散を持つようにデータを前処理する必要があります。 Scikit-Learn ライブラリは、それに対応する関数を提供しています。
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_)
機能の選択
問題を解決するために最も重要なことは、機能を適切に選択するか、さらには機能を作成する能力であることは疑いの余地がありません。これは、特徴選択と特徴エンジニアリングと呼ばれます。特徴量エンジニアリングは、直感や専門知識に依存するかなり創造的なプロセスですが、特徴量の選択に直接使用できるアルゴリズムがすでに多数存在します。たとえば、ツリー アルゴリズムはフィーチャの情報内容を計算できます。
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_)
他のすべての方法は、最適なサブセットを見つけるための特徴サブセットの効率的な検索に基づいており、これは、進化したモデルがこのサブセットで最高の品質を持つことを意味します。 Recursive Feature Elimination (RFE) はこれらの検索アルゴリズムの 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 ライブラリには基本的な機械学習アルゴリズムがすべて実装されています。そのうちのいくつかを見てみましょう。
ロジスティック回帰
は、分類問題 (二値分類) を解決するために最もよく使用されますが、多クラス分類 (いわゆる 1 対多の方法) も適しています。このアルゴリズムの利点は、出力オブジェクトごとに、対応するカテゴリの確率があることです。
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))
Naive Bayes
これは、最も有名な機械学習アルゴリズムの 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 最近傍) メソッドは、より複雑な分類アルゴリズムの一部としてよく使用されます。たとえば、その推定値をオブジェクトの特徴として使用できます。時々、単純な 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(支持向量机)是最流行的机器学习算法之一,它主要用于分类问题。同样也用于逻辑回归,SVM在一对多方法的帮助下可以实现多类分类。
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还有海量的更复杂的算法,包括了聚类, 以及建立混合算法的实现技术,如Bagging和Boosting。
如何优化算法的参数
在编写高效的算法的过程中最难的步骤之一就是正确参数的选择。一般来说如果有经验的话会容易些,但无论如何,我们都得寻找。幸运的是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)
至此我们已经看了整个使用Scikit-Learn库的过程,除了将结果再输出到一个文件中。这个就作为你的一个练习吧,和R相比Python的一大优点就是它有很棒的文档说明。
总结
以上がPython と Scikit-Learn を使用した機械学習の探索の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。