この資料の主な目的は、ライブラリにある機械学習アルゴリズムを利用できるようにするための十分な統計手法を理解することです。 scikit-learn Pythonを実行し、この知識を適用して、古典的な機械学習の問題を解決します。
旅の最初の目的地は、機械学習の簡単な歴史です。次に、さまざまなアルゴリズムについて詳しく説明します。最後の目的地では、学んだことを使用して解決します。 タイタニックの生存率予測問題 。
いくつかの免責事項:
それでは、始めましょう!
この分野に足を踏み入れるとすぐに、 機械学習 思ったほどロマンチックではありません。当初は、もっと学んだ後、自分でAIジャービスを作れるようになり、ソフトウェアのコーディングとお金を稼ぐために1日中過ごし、屋外で本を読んだり、バイクに乗ったりできるようになることを期待していました。 、そして私の個人的なジャービスが私のポケットをより深くする間、無謀なライフスタイルを楽しんでいます。しかし、機械学習アルゴリズムの基礎は統計であることにすぐに気付きました。統計は、個人的には退屈で面白くないと感じています。幸いなことに、「退屈な」統計には非常に魅力的なアプリケーションがいくつかあることがわかりました。
これらの魅力的なアプリケーションにアクセスするには、統計を十分に理解する必要があることがすぐにわかります。機械学習アルゴリズムの目標の1つは、提供されたデータの統計的依存関係を見つけることです。
提供されるデータは、血圧と年齢の比較から、さまざまなピクセルの色に基づいた手書きのテキストの検索まで多岐にわたります。
そうは言っても、機械学習アルゴリズムを使用して暗号化ハッシュ関数(SHA、MD5など)への依存関係を見つけることができるかどうかを知りたいと思いました-適切な暗号化プリミティブがそのように構築されているため、それはできません依存関係を排除し、予測が非常に難しい結果を生成すること。無限の時間を考えると、機械学習アルゴリズムはあらゆる暗号モデルを解読する可能性があると思います。
残念ながら、私たちにはそれほど時間がないので、暗号通貨を効率的にマイニングする別の方法を見つける必要があります。ここまでどこまで来たの?
機械学習アルゴリズムのルーツは、英国の統計学者で18世紀に住んでいたトーマスベイズにあります。彼の記事 機会の教義の問題を解決するためのエッセイ 根底にある ベイズの定理 、統計の分野で広く適用されています。
19世紀に、ピエールシモンラプラスは出版しました 確率の分析理論 、ベイズの定理を拡張し、今日私たちがベイズの定理として知っていることを定義します。少し前に、Adrien-Marie Legendreは、「最小二乗」法について説明しました。これは、今日、教師あり学習でも広く使用されています。
20世紀は、この分野で公に知られている発見のほとんどが行われた時期です。アンドレイ・マルコフは、詩を分析するために使用したマルコフ連鎖を発明しました。 Alan Turingは、人工知能になり、基本的に遺伝的アルゴリズムを予見できる学習マシンを提案しました。フランク・ローゼンブラットが発明した パーセプトロン 、それは大きな興奮と大きなメディア報道を引き起こしました。
しかし、その後、1970年代には、AIのアイデアに多くの悲観論があり、そのため資金が削減されたため、この期間は「冬」と呼ばれています。 1980年代のバックプロパゲーションの再発見は、機械学習研究の復活を引き起こしました。そして今日、それは再びホットな話題です。
故レオ・ブレイマンは、2つの統計パラダイムモデルを区別しました。 「アルゴリズムモデリング」とは、多かれ少なかれ、機械学習アルゴリズムを意味します。 ランダムフォレスト 。
機械学習と統計は関連分野です。 マイケルI.ジョーダンによると 方法論の原理から理論的なツールまで、機械学習のアイデアには、統計学において長い先史時代がありました。また、 デート科学 機械学習の専門家や政治家が取り組んできた一般的な問題の安定した用語として。
機械学習の分野は、次の2つの主要な柱で確立されています。 教師あり学習 Y 教師なし学習 。一部の人々はまた、次のような新しい研究分野を検討しています。 ディープラーニング —これは、教師あり学習または教師なし学習の一般的な質問とは別のものです。
教師あり学習 コンピューターに入力の例とそれらの望ましい出力が提示されたときに発生します。目標は、入力を出力にマップする一般式について学習することです。これは次のように分けることができます。
対照的に、 教師なし学習 これは、ラベルが付与されておらず、入力内の構造を見つけるのはアルゴリズム次第である場合に発生します。教師なし学習は、隠れたパターンを発見する必要がある場合、それ自体が目標になる可能性があります。
ディープラーニング これは、統計的概念だけでなく人工ニューラルネットワークに基づいているのと同じように、人間の脳の構造と機能に触発された新しい研究分野です。ディープラーニングは、教師ありアプローチと教師なしアプローチの両方で使用できます。
この記事では、より単純な教師あり機械学習アルゴリズムのいくつかを見て、それらを使用して、タイタニック号の悲劇的な沈没における個人の生存オッズを計算します。ただし、一般的に、使用するアルゴリズムがわからない場合は、開始するのに適した場所です。 機械学習アルゴリズムレビューシート scikit-learn 。
おそらく最も単純なアルゴリズムは線形回帰です。これは直線としてグラフィカルに表すことができる場合もありますが、その名前にもかかわらず、多項式の仮説がある場合、この線は曲線である可能性があります。いずれの場合も、スカラー従属変数$および$と、$ x $で示される1つ以上の説明値との間の関係をモデル化します。
素人の言葉で言えば、これは線形回帰が既知の$ x $と$ y $のそれぞれの間の依存関係を学習するアルゴリズムであることを意味します。これを使用して、$ xの未知のサンプルの$ y $を予測できます。 $。
Androidでアプリを最適化する方法
最初の教師あり学習の例では、基本的な線形回帰モデルを使用して、年齢に基づいて人の血圧を予測します。 東 これは、年齢と血圧という2つの重要な特性を持つ非常に単純なデータセットです。
上記のように、ほとんどの機械学習アルゴリズムは、提供されたデータへの統計的依存関係を見つけることによって機能します。この依存関係は、 仮説 通常、$ h( theta)$で表されます。
この仮説を解読するために、データをダウンロードして調査することから始めましょう。
import matplotlib.pyplot as plt from pandas import read_csv import os # Cargar datos data_path = os.path.join(os.getcwd(), 'data/blood-pressure.txt') dataset = read_csv(data_path, delim_whitespace=True) # Tenemos 30 entradas en nuestro set de data y cuatro características. La primera característica es la identificación de la entrada. # La segunda característica siempre es la nro. 1. La tercera es la edad y la última es la presión arterial. # Ahora dejaremos de lado la Identificación y la característica Uno por ahora, ya que no es importante. dataset = dataset.drop(['ID', 'One'], axis=1) # Y mostraremos esta gráfica %matplotlib inline dataset.plot.scatter(x='Age', y='Pressure') # Ahora, asumiremos que ya sabemos la hipótesis y parece una línea recta h = lambda x: 84 + 1.24 * x # ahora agreguemos esta línea a la gráfica ages = range(18, 85) estimated = [] for i in ages: estimated.append(h(i)) plt.plot(ages, estimated, 'b')
[]
上のグラフでは、青い点はそれぞれサンプルデータを表しており、青い線はアルゴリズムが学習する必要のある仮説です。では、この仮説は何ですか?
この問題を解決するには、$ x $と$ y $の間の依存関係を学習する必要があります。これは、$ y = f(x)$で表されます。したがって、$ f(x)$は理想的な目的関数です。機械学習アルゴリズムは、未知の$ f(x)$の最も近い近似である仮説関数$ h(x)$を推測しようとします。
線形回帰問題の最も単純な仮説は、次のようになります。$ h_ theta(x)= theta_0 + theta_1 * x $。単純な入力スカラー変数$ x $があり、単純なスカラー変数$ y $を出力します。ここで、$ theta_0 $と$ theta_1 $は学習する必要のあるパラメーターです。この青い線をデータに当てはめるプロセスは、線形回帰と呼ばれます。入力パラメーター$ x_1 $が1つしかないことを理解することが重要です。ただし、仮説関数の多くには、傾斜した単位($ x_0 $)も含まれます。したがって、結果の仮説は$ h_ theta(x)= theta_0 * x_0 + theta_1 * x_1 $の形式になります。ただし、ほとんどの場合1に等しいため、$ x_0 $の記述を回避できます。
青い線に戻ります。私たちの仮説は次のようになります$ h(x)= 84 + 1.24x $、つまり$ theta_0 = 84 $および$ theta_1 = 1.24 $です。これらの$ theta $値を自動的に導出するにはどうすればよいですか?
を定義する必要があります コスト関数 。基本的に、コスト関数が行うことは、予測モデルと出力自体の間の二乗誤差を計算することです。
[J( theta)= frac {1} {2m} sum_ {i = 1} ^ m(h_ theta(x ^ {(i)})-y ^ {(i)})^ 2 ]たとえば、私たちの仮説では、48歳の人の場合、血圧は$ h(48)= 84 + 1.24 * 48 = 143mmHg $であると予測しています。ただし、トレーニングサンプルでは、$ 130 mmHg $の値があります。したがって、エラーは$(143-130)^ 2 = $ 169です。次に、トレーニングデータセットの各入力でこのエラーを計算し、それをすべて合計する必要があります($ sum_ {i = 1} ^ m(h_ theta(x ^ {(i)})-y ^ {(i )})^ 2 $)そしてそこから重要な値を取ります。これにより、関数のコストを表す単一のスカラー数が得られます。私たちの目標は、コスト関数が低くなるように、値$ theta $を見つけることです。つまり、コスト関数を最小化する必要があります。うまくいけば、これは直感的です。コスト関数の値が小さい場合、これは予測誤差も低いことを意味します。
import numpy as np # Calculemos el costo para la hipótesis de arriba h = lambda x, theta_0, theta_1: theta_0 + theta_1 * x def cost(X, y, t0, t1): m = len(X) # the number of the training samples c = np.power(np.subtract(h(X, t0, t1), y), 2) return (1 / (2 * m)) * sum(c) X = dataset.values[:, 0] y = dataset.values[:, 1] print('J(Theta) = %2.2f' % cost(X, y, 84, 1.24))
J(Theta) = 1901.95
ここで、$ theta $の値を見つける必要があります。 コスト関数 最小限です。しかし、どうすればそれができますか?
[minJ( theta)= frac {1} {2m} sum_ {i = 1} ^ m(h_ theta(x ^ {(i)})-y ^ {(i)})^ 2 ]可能なアルゴリズムはたくさんありますが、最も人気のあるものは 下向きの勾配 。最急降下法の背後にある直感を理解するために、最初にそれをグラフに載せましょう。簡単にするために、より単純な仮説$ h( theta)= theta_1 * x $を仮定します。次に、$ x $が$ theta $の値であり、$ y $がこの時点でのコスト関数である単純な2Dグラフが作成されます。
import matplotlib.pyplot as plt fig = plt.figure() # Genera los datos theta_1 = np.arange(-10, 14, 0.1) J_cost = [] for t1 in theta_1: J_cost += [ cost(X, y, 0, t1) ] plt.plot(theta_1, J_cost) plt.xlabel(r'$ heta_1$') plt.ylabel(r'$J( heta)$') plt.show()
匿名関数内で、jqueryを使用してフッターdivを選択します。 「フッター」のIDがあります。
コスト関数は凸関数です。つまり、区間$ [a、b] $には最小値が1つだけあります。つまり、最良のパラメーター$ theta $は、コスト関数が最も低いポイントにあります。
基本的に、最急降下法は、関数を最小化するパラメーターのセットを見つけようとするアルゴリズムです。これは、パラメーターの初期セットから始まり、勾配関数の負の方向に向かってインタラクティブにステップを実行します。
特定の点で仮説関数の導関数を計算すると、その点で曲線に接する線に直接アクセスできます。これは、グラフの各ポイントでショートカットを計算できることを意味します。
アルゴリズムが機能する方法は次のとおりです。
ここで、収束条件はアルゴリズムの実装に依存します。たぶん、私たちは50歩後、いくつかの腰痛または何か他の後に停止します。
import math # Ejemplo del algoritmo simple de descenso gradiente tomado de Wikipedia cur_x = 2.5 # The algorithm starts at point x gamma = 0.005 # Step size multiplier precision = 0.00001 previous_step_size = cur_x df = lambda x: 2 * x * math.cos(x) # Recuerda la curva de aprendizaje y establécela while previous_step_size > precision: prev_x = cur_x cur_x += -gamma * df(prev_x) previous_step_size = abs(cur_x - prev_x) print('The local minimum occurs at %f' % cur_x)
El mínimo local pasa en 4.712194
この記事では、これらのアルゴリズムを実装しません。代わりに、すでに採用されているscikit-learn
、Pythonオープンソースの機械学習ライブラリを使用します。さまざまなデータマイニングや機械学習の問題に役立つ多くのAPIを提供します。
De sklearn.linear_model importar LinearRegression # La Regresión Lineal usa el método de descenso gradiente # Nuestra data X = dataset[['Age']] y = dataset[['Pressure']] regr = LinearRegression() regr.fit(X, y) # Salidas Argumentadas plt.xlabel('Age') plt.ylabel('Blood pressure') plt.scatter(X, y, color='black') plt.plot(X, regr.predict(X), color='blue') plt.show() plt.gcf().clear()
print( 'Predicted blood pressure at 25 y.o. = ', regr.predict(25) ) print( 'Predicted blood pressure at 45 y.o. = ', regr.predict(45) ) print( 'Predicted blood pressure at 27 y.o. = ', regr.predict(27) ) print( 'Predicted blood pressure at 34.5 y.o. = ', regr.predict(34.5) ) print( 'Predicted blood pressure at 78 y.o. = ', regr.predict(78) )
Predicted blood pressure at 25 y.o. = [[ 122.98647692]] Predicted blood pressure at 45 y.o. = [[ 142.40388395]] Predicted blood pressure at 27 y.o. = [[ 124.92821763]] Predicted blood pressure at 34.5 y.o. = [[ 132.20974526]] Predicted blood pressure at 78 y.o. = [[ 174.44260555]]
機械学習の問題を扱うときは、さまざまな種類のデータを認識する方法を知ることが重要です。数値(連続または離散)、カテゴリ、または順序データの場合があります。
数値データ それらは尺度としての意味を持っています。例:年齢、体重、人のビットコインの数、または人が月に書くことができる記事の数。数値データは、離散的または連続的にすることもできます。
カテゴリデータ それらは、人の性別、婚姻状況、国などの値を表します。これらのデータは数値にすることができますが、これらの数値には数学的な値はありません。追加することはできません。
順序データ カテゴリに数学的に意味のある方法で番号を付けることができる他のタイプの組み合わせにすることができます。一般的な例は評価です。1から10のスケールで評価するように求められることがよくあります。そのような場合、整数のみが許可されます。このデータを数値的に使用することはできますが(たとえば、何かの平均ランクを見つけるために)、機械学習手法を適用する場合、このデータをカテゴリとして扱うことがよくあります。
線形回帰は、特定のサイズの家や特定の部屋の価格などの数値を予測するのに役立つ素晴らしいアルゴリズムです。ただし、次のような質問への回答を得るために、カテゴリデータを予測したい場合があります。
あるいは:
これらの質問はすべて、 分類問題 。そして、最も単純な分類アルゴリズムはと呼ばれます ロジスティック回帰 、これは最終的に回帰に等しくなります 線形 あなたが別の仮説を持っていることを除いて。
まず、同じ線形仮説$ h_ theta(x)= theta ^ T X $を再利用できます(これはベクトル化された形式です)。線形回帰は$ [a、b] $の間隔で任意の数として出力できますが、ロジスティック回帰は$ [-1、1] $の値しか取得できません。これは、オブジェクトがカテゴリまたはカテゴリに属する確率を示します。そうではありません。
使用する場合 シグモイド関数 、$ [-1、1] $の範囲の値を表すために任意の数値を変換できます。
[f(x)= frac {1} {1 + e ^ x} ]$ x $の代わりに、既存の仮説を渡す必要があり、次のようになります。
[f(x)= frac {1} {1 + e ^ { theta_0 + theta_1 * x_1 + ... + theta_n * x_n}} ]この後、仮説がゼロより大きい場合は真の値になり、そうでない場合は偽になるという単純なしきい値を適用できます。
[h_ theta(x)= begin {cases} 1& mbox {if} theta ^ T X> 0 \ 0& mbox {else} end {cases} ]これは、同じものを使用できることを意味します コスト関数 ロジスティック回帰仮説を学習するための同じ下降勾配アルゴリズム。
次の機械学習の例では、スペースシャトルのパイロットに、着陸を手動または自動で制御する必要があるかどうかをアドバイスします。我々は持っています 非常に小さなデータセット —15サンプル—6つの特性と グラウンドトゥルース 。
機械学習アルゴリズムでは、「 グラウンドトゥルース 」は、教師あり学習手法のトレーニングセットの分類の精度を指します。
データセットは完全です。つまり、不足している機能はありません。それにもかかわらず、一部の機能にはカテゴリの代わりに「*」が付いています。これは、この機能が重要ではないことを意味します。このようなすべてのアスタリスクはゼロに置き換えられます。
de sklearn.linear_model importar LogisticRegression # Data data_path = os.path.join(os.getcwd(), 'data/shuttle-landing-control.csv') dataset = read_csv(data_path, header=None, names=['Auto', 'Stability', 'Error', 'Sign', 'Wind', 'Magnitude', 'Visibility'], na_values='*').fillna(0) # Preparar características X = dataset[['Stability', 'Error', 'Sign', 'Wind', 'Magnitude', 'Visibility']] y = dataset[['Auto']].values.reshape(1, -1)[0] model = LogisticRegression() model.fit(X, y) # Por ahora nos falta un concepto importante. No sabemos qué tan bien funciona nuestro # modelo y debido a ello, en realidad no podemos mejorar el rendimiento de nuestra hipótesis. # Hay muchas métricas útiles pero por ahora, validaremos que tan bien # Actúa nuestro algoritmo en el set de datos, en el cual aprendió. 'La puntuación de nuestro modelo es %2.2f%%' % (model.score(X, y) * 100)
Puntuación de nuestro modelo es 73.33%
レスポンシブウェブデザイン画像のベストプラクティス
上記の例では、学習データを使用してモデルのパフォーマンスを検証しました。しかし、私たちのアルゴリズムがデータを無視するかもしれないし、無視しないかもしれないことを考えると、それは良い選択でしょうか?家の大きさを表す特性と価格を表す特性がある、より簡単な例を見てみましょう。
de sklearn.pipeline importar make_pipeline de sklearn.preprocessing importer PolynomialFeatures de sklearn.linear_model importar LinearRegression de sklearn.model_selection importar cross_val_score # Función Verdad del terreno ground_truth = lambda X: np.cos(15 + np.pi * X) # Generar observaciones aleatorias alrededor de la función verdad del terreno n_samples = 15 degrees = [1, 4, 30] X = np.linspace(-1, 1, n_samples) y = ground_truth(X) + np.random.randn(n_samples) * 0.1 plt.figure(figsize=(14, 5)) models = {} # Trazar todos modelos del algoritmo de aprendizaje de máquina para idx, degree in enumerate(degrees): ax = plt.subplot(1, len(degrees), idx + 1) plt.setp(ax, xticks=(), yticks=()) # Definir el modelo polynomial_features = PolynomialFeatures(degree=degree) model = make_pipeline(polynomial_features, LinearRegression()) models[degree] = model # Entrenar el modelo model.fit(X[:, np.newaxis], y) # Evaluar el modelo usando validación cruzada scores = cross_val_score(model, X[:, np.newaxis], y) X_test = X plt.plot(X_test, model.predict(X_test[:, np.newaxis]), label='Model') plt.scatter(X, y, edgecolor='b', s=20, label='Observations') plt.xlabel('x') plt.ylabel('y') plt.ylim((-2, 2)) plt.title('Degree {}
MSE = {:.2e}'.format( degree, -scores.mean())) plt.show()
機械学習アルゴリズムモデルは 過度に一般化 トレーニングデータも新しい観測値も一般化できない場合。上記の例では、単純な線形仮説を使用しています。これは、実際のトレーニングデータを表していないため、パフォーマンスが非常に低くなります。通常、過剰一般化については、適切な測定で簡単に検出できるため、説明しません。
アルゴリズムが表示されたすべての観測値を記憶している場合、トレーニングデータセットの外部にある新しい観測値ではパフォーマンスが低下します。これは呼ばれます 過剰適合 。たとえば、30次多項式モデルはほとんどのポイントを通過し、トレーニングセットで良いスコアを持ちますが、これ以外のものはパフォーマンスが低下します。
私たちのデータセットは、2Dでプロットできる単純な特徴で構成されています。しかし実際には、何百もの特徴を持つデータセットが存在する可能性があるため、ユークリッド空間で視覚的にプロットすることは不可能です。モデルが過剰一般化または過剰適合されているかどうかを確認するために、他にどのようなオプションが必要ですか?
コンセプトを紹介する時が来ました 学習曲線 。これは、トレーニングサンプルの数に対する二乗誤差をプロットした単純なグラフです。
学習教材には、次のようなグラフィックがあります。
しかし、実際には、そのような完璧なイメージに出くわすことはありません。各モデルの学習曲線をプロットしてみましょう。
from sklearn.model_selection import learning_curve, ShuffleSplit # Trazar curvas de aprendizaje plt.figure(figsize=(20, 5)) for idx, degree in enumerate(models): ax = plt.subplot(1, len(degrees), idx + 1) plt.title('Degree {}'.format(degree)) plt.grid() plt.xlabel('Training examples') plt.ylabel('Score') train_sizes = np.linspace(.6, 1.0, 6) # Validación cruzada con 100 iteraciones para obtener una prueba sencilla de *mean* y entrenamiento # curvas de puntuación cada vez con 20% de los datos seleccionados aleatoriamente como set de validación. cv = ShuffleSplit(n_splits=100, test_size=0.2, random_state=0) model = models[degree] train_sizes, train_scores, test_scores = learning_curve( model, X[:, np.newaxis], y, cv=cv, train_sizes=train_sizes, n_jobs=4) train_scores_mean = np.mean(train_scores, axis=1) test_scores_mean = np.mean(test_scores, axis=1) plt.plot(train_sizes, train_scores_mean, 'o-', color='r', label='Training score') plt.plot(train_sizes, test_scores_mean, 'o-', color='g', label='Test score') plt.legend(loc = 'best') plt.show()
シミュレートされたシナリオでは、トレーニングスコアを表す青い線は直線のように見えます。実際には、わずかに減少します。1次多項式のグラフで確認できますが、他の場合は、この解像度では微妙すぎて確認できません。少なくとも、トレーニングの学習曲線と「高傾斜」シナリオでのテスト観測値には大きな違いがあることがわかります。
中央の「通常の」学習分類グラフでは、トレーニングとテストのスコアラインがどのように組み合わされているかを確認できます。
また、「高分散」グラフでは、サンプル数が少ない場合、テストとトレーニングのスコアが非常に似ていることがわかりますが、テストの数を増やすと、テストがそのテストである限り、トレーニングスコアはほぼ完全なままです。離れて成長しています。
過度に一般化されたモデル(モデルと呼ばれる)を修正できます 大きな傾斜 )たとえば、非線形仮説を使用する場合、より多くの多項式特性を持つ仮説。
オーバーフィットモデル( 大きなバリエーション )表示された各例について。しかし、それでもテストデータが導入されると、学習曲線間の差が大きくなります。正則化、交差検定、およびその他のデータサンプルを使用して、過剰適合モデルを修正できます。
過剰適合を回避するために使用される一般的な方法の1つは、利用可能なデータの一部を保存し、それをテストセットとして使用することです。ただし、多項式特性の数など、モデルのさまざまな構成を評価する場合、推定量の最適なパフォーマンスを実現するためにパラメーターをわずかに変更できるため、テストセットを過剰適合させるリスクがあります。これが私たちの知識の理由です。テストセットでは、モデルにリークする可能性があります。この問題を解決するには、「検証セット」と呼ばれるデータセットの別の部分を適切に使用する必要があります。トレーニングはトレーニングセットで行われ、モデルの最適なパフォーマンスが達成されたと確信した場合、検証セットを使用して評価を行うことができます。
ただし、データのパーティションを3セット作成すると、モデルのトレーニングに使用できるサンプルの数が大幅に減少し、結果は検証トレーニングセットのペアの特定のランダムな選択に依存する可能性があります。
この問題の1つの解決策は、相互検証と呼ばれる手順です。標準の$ k $フォールド交差検定では、データはフォールドと呼ばれる$ k $サブセットに分割されます。次に、アルゴリズムは$ k-1 $フォールドで繰り返しトレーニングされ、残りのフォールドはテストセットとして使用されます(「 ホールドアウトプリーツ 」)
交差検定では、元のトレーニングセットでのみパラメーターを段階的に変化させることができます。これにより、テストセットを非表示のデータセットとして保持し、最終的なモデルを選択できます。
他にも多くの相互検証手法があります。 Pを除外する 、 層化$ k $ -fold 、 シャッフルして分割 、など。ただし、これらはこの記事の範囲外です。
ブートストラップをWebサイトにどのように組み込むことができますか?
これは、モデルの過剰適合の問題を解決するのに役立つもう1つの手法です。ほとんどのデータセットには、パターンとノイズがあります。正則化の目的は、モデルに対するノイズの影響を減らすことです。
ラッソ、ティホノフ、ストレッチメッシュの3つの主要な正則化手法があります。
L1正則化 (または ラッソ正則化 )は、いくつかの特性を選択してゼロに最小化するものであるため、これらは最終モデルとは関係ありません。 L1は、重要な特性を選択する方法と見なすことができます。
** L2正則化**(または** Tikhonov正則化**)は、強制を担当するものです。 すべて 特性が比較的小さいため、モデルへの影響が少なくなります。
ストレッチメッシュ それは 組み合わせ L1とL2の。
スケーリング機能も、データが前処理されている間の重要なステップです。私たちのデータセットは、$ [- infty、 infty] $値を持ついくつかの特性と、異なるスケールを持つ他の特性を持つことができます。これは、独立した値の範囲を標準化できる方法です。
スケーリング機能は、学習モデルのパフォーマンスを向上させるための重要なプロセスです。まず、すべてのフィーチャが同じパターンにスケーリングされている場合、最急降下法ははるかに速く収束します。同様に、多くのアルゴリズム(サポートベクターマシン(SVM)など)は、2点間の距離を計算することで機能し、フィーチャの1つに大きな値がある場合、距離はこのフィーチャの影響を大きく受けます。
分析のためにTwitterデータを取得する方法
SVM(英語名による) サポートベクターマシン )は、分類と回帰の問題に使用できるもう1つの一般的な機械学習アルゴリズムです。 SVMでは、各観測値は$ n $次元空間内の点としてプロットされます。ここで、$ n $は私たちが持っている特徴の数です。各フィーチャの値は、特定の座標の値です。次に、2つのクラスを非常にうまく分離する超平面を見つけようとします。
最適な超平面を特定した後、2つのクラスをさらに分離するのに役立つマージンを追加する必要があります。
SVMは、特徴の数が非常に多い場合、または特徴の数がデータサンプルの数よりも多い場合に非常に効果的です。ただし、SVMは通常ベクトルで機能するため、使用する前にデータを正規化することが重要です。
ニューラルネットワークアルゴリズムは、おそらく機械学習研究の最もエキサイティングな分野です。ニューラルネットワークは、脳内のニューロンの接続を模倣しようとします。
これがニューラルネットワークの仕組みです。多くのノードを組み合わせて、各ノードが一連の出力を受け取り、いくつかの計算を行ってから、値を出力します。
教師あり学習と教師なし学習の両方に対応するさまざまなニューラルネットワークアルゴリズムがあります。ニューラルネットワークは、自動運転車の運転、ビデオゲームのプレイ、飛行機の着陸、画像の分類などに使用できます。
RMSタイタニック号は、氷山と衝突した後、1912年4月15日に北大西洋に沈んだイギリスの船でした。約2,224人の乗客と乗組員が乗船し、そのうち1,500人以上が死亡し、最近では最も致命的な商業海事災害の1つとなっています。
問題の分類に使用される最も基本的な機械学習アルゴリズムの1つの直感を理解したので、知識を適用して、タイタニック号に乗っている人の生存率を予測できます。
私たちのデータセットは Kaggleの競争力科学データプラットフォーム 。
import os from pandas import read_csv, concat # Cargar datos data_path = os.path.join(os.getcwd(), 'data/titanic.csv') dataset = read_csv(data_path, skipinitialspace=True) dataset.head(5)
PassengerId | 生き残った | Pclass | 名前 | セックス | 年齢 | SibSp | 尊敬 | チケット | するために | キャビン | 着手 | |
0 | 1 | 0 | 3 | ブラウン、オーウェン・ハリス氏 | 男性 | 22.0 | 1 | 0 | A / 5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | カミングス、ジョン・ブラッドリー夫人(Florence Briggs Th .. .. | 女性 | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | ヘイッキネン、ミス。ローン | 女性 | 26.0 | 0 | 0 | STON / O2。 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle、Mrs。JacquesHeath(Lily May Peel) | 女性 | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | アレン、ウィリアム・ヘンリー氏 | 男性 | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
最初のステップは、データを読み込んで調査することです。 891件のテストレコードがあります。各レコードの構造は次のとおりです。
このデータセットには、数値情報とカテゴリ情報の両方が含まれています。通常は、所有しているデータをさらに掘り下げ、それに基づいて仮定を作成することをお勧めします。ただし、この場合、このステップをスキップして、予測に直接進みます。
import pandas as pd # Necesitamos eliminar algunas características insignificantes y mapear el resto. # Número y costo del boleto no deberían contribuir en el rendimiento de nuestro modelo. # Característica de nombres viene con títulos (como: Sr. Srta. Doctor) incluidos. # El género es muy importante. # El Puerto de embarcación podría ser atribuir algún valor. # Usar el Puerto de embarcación podría ser contra-intuitivo pero podría # existir una tasa de supervivencia más alta para pasajeros que abordaron en el mismo Puerto. dataset['Title'] = dataset.Name.str.extract(' ([A-Za-z]+).', expand=False) dataset = dataset.drop(['PassengerId', 'Ticket', 'Cabin', 'Name'], axis=1) pd.crosstab(dataset['Title'], dataset['Sex'])
タイトルセックス | 女性 | 男性 |
大尉 | 0 | 1 |
とともに | 0 | 2 |
伯爵夫人 | 1 | 0 |
ドン | 0 | 1 |
博士 | 1 | 6 |
ヨンクヘール | 0 | 1 |
レディ | 1 | 0 |
メジャー | 0 | 2 |
主人 | 0 | 40 |
お嬢 | 182 | 0 |
MS | 2 | 0 |
夫人 | 1 | 0 |
氏 | 0 | 517 |
夫人 | 125 | 0 |
MS | 1 | 0 |
改訂 | 0 | 6 |
お客様 | 0 | 1 |
# Reemplazaremos muchos títulos con un nombre más común, equivalente Inglés, # o re-clasificación dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Other') dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss') dataset['Title'] = dataset['Title'].replace('Ms', 'Miss') dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs') dataset[['Title', 'Survived']].groupby(['Title'], as_index=False).mean()
題名 | 生き残った | |
0 | 主人 | 0.575000 |
1 | お嬢 | 0.702703 |
2 | 氏 | 0.156673 |
3 | 夫人 | 0.793651 |
4 | その他 | 0.347826 |
# Ahora mapearemos categorias alfanumericas a números title_mapping = { 'Mr': 1, 'Miss': 2, 'Mrs': 3, 'Master': 4, 'Other': 5 } gender_mapping = { 'female': 1, 'male': 0 } port_mapping = { 'S': 0, 'C': 1, 'Q': 2 } # Mapa de título dataset['Title'] = dataset['Title'].map(title_mapping).astype(int) # Mapa de género dataset['Sex'] = dataset['Sex'].map(gender_mapping).astype(int) # Mapa de puerto freq_port = dataset.Embarked.dropna().mode()[0] dataset['Embarked'] = dataset['Embarked'].fillna(freq_port) dataset['Embarked'] = dataset['Embarked'].map(port_mapping).astype(int) # Arreglar errores de edades que falten dataset['Age'] = dataset['Age'].fillna(dataset['Age'].dropna().median()) dataset.head()
生き残った | Pclass | セックス | 年齢 | SibSp | 尊敬 | するために | 着手 | 題名 | |
0 | 0 | 3 | 0 | 22.0 | 1 | 0 | 7.2500 | 0 | 1 |
1 | 1 | 1 | 1 | 38.0 | 1 | 0 | 71.2833 | 1 | 3 |
2 | 1 | 3 | 1 | 26.0 | 0 | 0 | 7.9250 | 0 | 2 |
3 | 1 | 1 | 1 | 35.0 | 1 | 0 | 53.1000 | 0 | 3 |
4 | 0 | 3 | 0 | 35.0 | 0 | 0 | 8.0500 | 0 | 1 |
この時点で、scikit-learn
を使用してPythonでさまざまなタイプの機械学習アルゴリズムを分類します。別のモデルのセットを作成します。どちらが優れているかを簡単に確認できます。
モデルごとに、$ k $倍の検証を使用します。
de sklearn.model_selection importar KFold, train_test_split de sklearn.pipeline importar make_pipeline de sklearn.preprocessing importar PolynomialFeatures, StandardScaler de sklearn.neural_network importar MLPClassifier de sklearn.svm importar SVC # Preparar data X = dataset.drop(['Survived'], axis = 1).values y = dataset[['Survived']].values X = StandardScaler().fit_transform(X) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state = None) # Prepare cross-validation (cv) cv = KFold(n_splits = 5, random_state = None) # Rendimiento p_score = lambda model, score: print('Performance of the %s model is %0.2f%%' % (model, score * 100)) # Clasificadores names = [ 'Logistic Regression', 'Logistic Regression with Polynomial Hypotheses', 'Linear SVM', 'RBF SVM', 'Neural Net', ] classifiers = [ LogisticRegression(), make_pipeline(PolynomialFeatures(3), LogisticRegression()), SVC(kernel='linear', C=0.025), SVC(gamma=2, C=1), MLPClassifier(alpha=1), ]
# iterate over classifiers models = [] trained_classifiers = [] for name, clf in zip(names, classifiers): scores = [] for train_indices, test_indices in cv.split(X): clf.fit(X[train_indices], y[train_indices].ravel()) scores.append( clf.score(X_test, y_test.ravel()) ) min_score = min(scores) max_score = max(scores) avg_score = sum(scores) / len(scores) trained_classifiers.append(clf) models.append((name, min_score, max_score, avg_score)) fin_models = pd.DataFrame(models, columns = ['Name', 'Min Score', 'Max Score', 'Mean Score'])
fin_models.sort_values(['Mean Score']).head()
名前 | 私の点数 | 最大スコア | 平均スコア | |
2 | 線形SVM | 0.793296 | 0.821229 | 0.803352 |
0 | ロジスティック回帰 | 0.826816 | 0.860335 | 0.846927 |
4 | ニューラルネット | 0.826816 | 0.860335 | 0.849162 |
1 | 多項式仮説によるロジスティック回帰 | 0.854749 | 0.882682 | 0.869274 |
3 | RBFSVM | 0.843575 | 0.888268 | 0.869274 |
さて、私たちの実験的研究は、SVM分類器が動径基底関数(RBF)カーネルで最高のパフォーマンスを発揮することを示しています。これで、モデルをシリアル化して、本番アプリケーションで再利用できます。
import pickle svm_model = trained_classifiers[3] data_path = os.path.join(os.getcwd(), 'best-titanic-model.pkl') pickle.dump(svm_model, open(data_path, 'wb'))
機械学習は複雑ではありませんが、非常に幅広い研究分野であり、そのすべての概念を理解するには、数学と統計の分野の知識が必要です。
現在、機械学習とディープラーニングは、主に音声認識、車の運転、金融取引などの多くの繰り返しタスクを自動化できるため、シリコンバレーで最も人気のあるトピックの1つです。 患者ケア 、 クック 、 マーケティング 、とりわけ。
この知識があれば、Kaggleの課題を解決できます。
これは、教師あり機械学習アルゴリズムの簡単な紹介でした。幸いなことに、機械学習アルゴリズムに関する多くのオンラインコースと情報があります。個人的には、CourseraのAndrewNgのコースから始めることをお勧めします。