【scikit-learn】Pythonによる機械学習実験

5704 ワード

概要
本文はPythonプログラミング言語を用いて機械学習の小実験を行った最初の編である.主な内容は以下の通りです.
  • データを読み込み、洗浄する
  • .
  • 探索理解入力データの特徴
  • は、学習アルゴリズムのためにデータ
  • を提示する方法を分析する.
  • 正しいモデルと学習アルゴリズム
  • を選択する
  • 評価プログラム表現の正確性
  • 読み込みデータReading the data
    データを読み込むと、無効な処理やデータの損失の問題に直面し、正確な科学よりも芸術的な処理方法になります.この部分の処理は,より多くの機械学習アルゴリズムに適切に適用でき,従って成功の確率を高めることができるからである.
    データをNumPyで効率よく噛み、SciPyでスマートに吸収
    Pythonは高度に最適化された解釈言語で、数値の重いアルゴリズムを処理する上でCなどの言語よりずっと遅いが、なぜ多くの科学者と会社が計算が密集している分野でPythonに賭けているのだろうか.Pythonは,CやFortranのような下位拡張子に数値計算タスクを容易に割り当てることができるからである.このうちNumPyとSciPyがその代表です.NumPyはarrayのような多くの有効なデータ構造を提供し、SciPyはこれらのarraysを処理するための多くのアルゴリズムを提供している.このツールボックスは、マトリクス操作、線形代数、最適化問題、クラスタリング、さらには高速フーリエ変換にかかわらず、ニーズを満たすことができます.
    データ読み込み操作
    ここでは,ページクリックデータを例にとると,1次元属性は時間,2次元データはクリック個数である.
    import scipy as sp
    data = sp.genfromtxt('web_traffic.tsv', delimiter='\t')
    

    データの前処理とパージ
    データ構造を格納してデータを処理する準備ができたら、予測アクティビティを確保するためにより多くのデータが必要になるか、多くのデータがあるか、データサンプリングをよりよく行う方法を考える必要があります.元のデータ(raw data)を訓練する前に、データを抽出するのに良い役割を果たすことができ、抽出したデータを使用する簡単なアルゴリズムは、元のデータを使用する高度なアルゴリズムよりも効果的である場合がある.このワークフローはフィーチャーエンジニアリング(feature engineering)と呼ばれます.Creative and intelligent that you are, you will immediately see the results.
    データセットに無効な数値(nan)がある可能性があるため、無効な値の個数を事前に見ることができます.
    hours = data[:,0]
    hits = data[:,1]
    sp.sum(sp.isnan(hits))
    

    次の方法でフィルタリングします.
    #cleaning the data
    hours = hours[~sp.isnan(hits)]
    hits = hits[~sp.isnan(hits)]
    

    データを直感的に認識するために,Matplotlibのpyplotパケットを用いてデータを提示した.
    import matplotlib.pyplot as plt
    plt.scatter(hours,hits)
    plt.title("Web traffic over the last month")
    plt.xlabel("Time")
    plt.ylabel("Hits/hour")
    plt.xticks([w*7*24 for w in range(10)],
     ['week %i'%w for w in range(10)])
    plt.autoscale(tight=True)
    plt.grid()
    plt.show()
    

    次のように表示されます.
    適切な学習アルゴリズムの選択
    良い学習アルゴリズムを選ぶのは、あなたのツールボックスの3、4つのアルゴリズムの中からこんなに簡単ではありません.実際には、より多くのアルゴリズムを見たことがないかもしれません.これは、実行速度と精度のバランス、拡張性、使いやすさのバランスなど、異なる性能と機能のニーズを考慮した熟考プロセスです.
    今、私たちはすでにデータに対して直感的な認識を持っていて、私たちが次にしなければならないのは本当のモデルを見つけて、そして未来のデータの動きを推定することができます.
    近似誤差(approximation error)を用いてモデルを選択する
    多くのモデルで正しいモデルを選択するには,モデル予測性能を近似誤差で測定し,モデルを選択する必要がある.ここでは、予測値と実際の値の差の2乗を使用して、メトリック誤差を定義します.
    def error(f, x, y):
        return sp.sum((f(x)-y)**2)
    

    ここでfは予測関数を表す.
    単純な直線でデータをフィット
    このデータの隠蔽モデルが直線であると仮定すると,これらのデータをどのようにフィッティングして近似誤差を最小限に抑えるか.SciPyのpolyfit()関数はこの問題を解決し,xとy軸のデータを与え,パラメータorder(直線のorderは1)を与え,この関数は近似誤差を最小化するモデルのパラメータを与える.
    fp1, residuals, rank, sv, rcond = sp.polyfit(hours, hits, 1, full=True)
    

    fp 1はpolyfit関数がモデルパラメータを返し、直線にとって直線の傾きと断面積である.polyfitのパラメータfullがTrueであれば,フィット過程においてより多くの有用な情報が得られるだろうが,ここではresidualsだけが我々が興味を持っているが,これはフィット直線の近似誤差である.次に、線を図に描きます.
    #fit straight line model
    fp1, residuals, rank, sv, rcond = sp.polyfit(hours, hits, 1, full=True)
    fStraight = sp.poly1d(fp1)
    
    #draw fitting straight line
    fx = sp.linspace(0,hours[-1], 1000) # generate X-values for plotting
    plt.plot(fx, fStraight(fx), linewidth=4)
    plt.legend(["d=%i" % fStraight.order], loc="upper left")
    

    より高いカーブでデータをフィット
    直線でフィットするのは良いのでしょうか?直線フィッティングの誤差は317389767.34で、これは私たちの予測結果が良いか悪いかを示しています.より良い効果が得られるかどうかを、より高い曲線でデータをフィットさせることができます.
    fCurve3p = sp.polyfit(hours, hits, 3)
    fCurve3 = sp.poly1d(fCurve3p)
    print "Error of Curve3 line:",error(fCurve3,hours,hits)
    
    fCurve10p = sp.polyfit(hours, hits, 10)
    fCurve10 = sp.poly1d(fCurve10p)
    print "Error of Curve10 line:",error(fCurve10,hours,hits)
    
    fCurve50p = sp.polyfit(hours, hits, 50)
    fCurve50 = sp.poly1d(fCurve50p)
    print "Error of Curve50 line:",error(fCurve50,hours,hits)
    

    近似誤差は次のとおりです.
    Error of straight line: 317389767.34 Error of Curve2 line: 179983507.878 Error of Curve3 line: 139350144.032 Error of Curve10 line: 121942326.364 Error of Curve50 line: 109504587.153
    ここでは実験結果をさらに見て、私たちの予測曲線がデータによくフィットしているかどうかを見てみましょう.特に多項式の次数が10から50までの過程を見てみると、モデルとデータの貼り合わせがきつく、このようなモデルはデータの背後にあるモデルだけでなく、ノイズデータにもフィットし、曲線の振動が激しい.
    オーバーフィット.
    小結
    上の小さな実験から,直線フィットであれば簡単すぎるが,多項式の次数は10から50のフィットではあまりにも過大であることが分かるが,2,3次の多項式が最良の答えではないか.しかし、私たちは同時に、私たちがそれらを予測すれば、それらは無制限に成長することを発見しました.だから、私たちは最後に反省して、私たちはまだ本当にデータを理解していないようです.
    パフォーマンス指標
    MLの初心者として、学習器の性能を測定する上で多くの問題や間違いに遭遇します.あなたの訓練データを持ってテストを行うなら、これは簡単な問題かもしれません.バランスのとれたトレーニングデータに遭遇すると、データは予測の成功を決定します.
    データを見返す
    データをよく分析して、week 3からweek 4の間に明らかな曲がり角があるようなので、week 3を見てみましょう.5以降のデータが分離され、新しい曲線が訓練されます.
    inflection = 3.5*7*24 #the time of week3.5 is an inflection
    time1 = hours[:inflection]
    value1 = hits[:inflection]
    time2 = hours[inflection:]
    value2 = hits[inflection:]
    
    fStraight1p = sp.polyfit(time1,value1,1)
    fStraight1 = sp.poly1d(fStraight1p)
    fStraight2p = sp.polyfit(time2,value2,1)
    fStraight2 = sp.poly1d(fStraight2p)
    

    明らかに,この2つの直線はデータの特徴をより良く記述し,その近似誤差は高次多項式曲線の誤差よりも大きいが,この方式のフィッティングはデータの発展傾向をよりよく得ることができる.高次多項式曲線のオーバーフィット現象に対して,低次曲線ではデータの記述が不十分であるため,不フィットの場合がある.従って,データ特性をより良く記述するために,2次曲線を用いてデータをフィッティングし,過フィッティングと欠フィッティング現象の発生を回避した.
    トレーニングとテスト
    我々は訓練してモデルを得た.ここでは我々がフィッティングした2つの曲線である.我々が訓練したモデルが正確であるかどうかを検証するために,近似誤差だけでなくモデルの良し悪しを判別するために,最初の訓練時に訓練データの一部をテストデータとして使用することができる.
    まとめ
    この小節は機械学習小実験の導入として、主に2つの意味を伝えている:1、学習器を訓練するには、データを理解し、精錬しなければならない.アルゴリズムからデータに注意力を移す.2、機械学習実験をどのように行うかを学ぶ.訓練とテストデータの未来を混同しないで、私はスピードを速め、学習し、実践する.
    参考文献
    Building Machine Learning Systems with Python. Richert,W . Coelho,L P
    転載は作者Jason Dingとその出所Githubホームページ(http://jasonding1354.github.io/)CSDNブログ(http://blog.csdn.net/jasonding1354)ホームページ(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)