Pythonマシン学習【二】-意思決定ツリー


Pythonマシン学習【二】-意思決定ツリー
原文アドレス:Pythonマシン学習【二】-意思決定ツリー
前回sklearn Pythonライブラリに基づいてK近隣モデル(KNN)を作成し、機械学習Hello Worldの例を実現した.KNNは最も簡単な分類アルゴリズムであり、簡単に言えば新しい値を予測する際に、その最近のK点がどのタイプであるかによってどのカテゴリに属するかを判断する.KNNをマスターしたのも简単な入门の机械の学习で、新しいものを学ぶのはいつも浅から深くて、今度は别の分类のアルゴリズムを学ぶつもりです:决定の木
一、意思決定ツリー
決定ツリーアルゴリズムはツリー構造を採用し,層推理を用いて最終的な分類を実現し,if−then−else規則に基づく監視学習アルゴリズムであり,決定ツリーのこれらの規則は人工的に制定されたものではなく訓練によって得られる.
監視学習:指定されたデータ、予測ラベル、タグ付きトレーニングデータから予測関数を導出します.監視なし学習:所与のデータは、非表示の構造を探し、標識のない訓練データから結論を推定する.
私达の生活の中で多くの决定木の例があって、简単な栗を挙げます:银行は取引先に対して信用登录の评価を行って、期限切れの记录があるかどうか、期限切れの未返済の记录があるかどうか、不动产があるかどうかなどの指标によって评価を行って、以下の最も简単な模型を得ることができます:
二、目標
178個のワインサンプルデータが知られており、各サンプルはアルコール、リンゴ酸、灰、灰のアルカリ性、マグネシウム、総フェノールなど計13個の特徴をサンプリングし、ワインは3種類に分けられ、それぞれclass_0、class_1、class_2を表示します.
178個のワインの中:class_0は59個、class_1は71個、class_2は48個あり、178個のデータの70%を訓練データとして取り、訓練モデル、モデル評価を経て、残りの30%のデータサンプルのタイプを予測し、精度を計算し、学習によって生成された決定ツリーを表示した.
三、実現手順
  • sklearn
  • を取り付ける
    pip install -U scikit-learn
    
  • Python
  • を実現
  • 取得データ
  • from sklearn import datasets
    
    
    #        ,sklearn   
    wines = datasets.load_wine()
    """
     178   ,    13    (feature_names)
    feature_names:
        alcohol:   
        malic_acid:    
        ash:  
        alcalinity_of_ash:     
        magnesium:  
        total_phenols:   
        flavanoids:    
        nonflavanoid_phenols:       
        proanthocyanins:    
        color_intensity:     
        hue:   
        od280/od315_of_diluted_wines: od280/od315     
        proline:    
          (classes)
    classes:
        class_0
        class_1
        class_2
    """
    print("     ", list(wines.target_names))  # ['class_0', 'class_1', 'class_2']
    print("     ", list(wines.feature_names))  #   ,   
    print("    ", wines.data.shape)  # (178, 13)
    
  • データ前処理
  • x_train, x_test, y_train, y_test = train_test_split(wines.data, wines.target, test_size=0.3)  #     、         0.3
    print("   ", x_train.shape)  # (124, 13)
    print("   ", x_test.shape)  # (54, 13)
    
  • トレーニングモデル
  • clf = tree.DecisionTreeClassifier(criterion="entropy")  #          
    clf = clf.fit(x_train, y_train)
    
  • モデル評価
  • score = clf.score(x_test, y_test)
    print("   ", score)  # 0.9629629629629629
    
  • は、決定ツリー
  • を描く.
    graphvizは図形描画ツールで、dotスクリプトに基づいて木の図を描くことができます.windowsプラットフォームでgraphvizを使用するにはgraphvizソフトウェアをインストールしてからgraphviz pythonモジュールをインストールする必要があります.
  • graphvizソフトウェア
  • をインストール
    ダウンロードアドレス:graphvizソフトウェア注意インストール時にAdd Graphviz to the system PATHをチェックし、インストールに成功した後、PyCharmを再起動する必要がある
  • graphvizモジュール
  • をインストール
    pip install graphviz
    
  • は、決定ツリー
  • を描く.
    import graphviz
    
    feature_name = ['  ', '   ', ' ', '    ', ' ', '  ', '   ', '      ', '   ', '    ', '  ', 'od280/od315     ', '   ']
    class_names = ["class_0", "class_1", "class_2"]
    dot_data = tree.export_graphviz(clf, out_file='tree.dot', feature_names=feature_name, class_names=class_names, filled=True, rounded=True)
    #       
    with open("tree.dot", encoding='utf-8') as f:
        dot_graph = f.read()
        graph = graphviz.Source(dot_graph.replace("helvetica", "FangSong"))
    graph.view()
    

    完全なコード
    from sklearn import datasets
    from sklearn.model_selection import train_test_split
    from sklearn import tree
    import graphviz
    
    #        ,sklearn   
    wines = datasets.load_wine()
    """
     178   ,    13    (feature_names)
    feature_names:
        alcohol:   
        malic_acid:    
        ash:  
        alcalinity_of_ash:     
        magnesium:  
        total_phenols:   
        flavanoids:    
        nonflavanoid_phenols:       
        proanthocyanins:    
        color_intensity:     
        hue:   
        od280/od315_of_diluted_wines: od280/od315     
        proline:    
          (classes)
    classes:
        class_0
        class_1
        class_2
    """
    print("     ", list(wines.target_names))  # ['class_0', 'class_1', 'class_2']
    print("     ", list(wines.feature_names))  #   ,   
    print("    ", wines.data.shape)  # (178, 13)
    
    x_train, x_test, y_train, y_test = train_test_split(wines.data, wines.target, test_size=0.3)  #     、         0.3
    print("   ", x_train.shape)
    print("   ", x_test.shape)
    
    clf = tree.DecisionTreeClassifier(criterion="entropy")  #          
    clf = clf.fit(x_train, y_train)
    score = clf.score(x_test, y_test)
    print("   ", score)
    
    feature_name = ['  ', '   ', ' ', '    ', ' ', '  ', '   ', '      ', '   ', '    ', '  ', 'od280/od315     ', '   ']
    class_names = ["class_0", "class_1", "class_2"]
    dot_data = tree.export_graphviz(clf, out_file='tree.dot', feature_names=feature_name, class_names=class_names, filled=True, rounded=True)
    #       
    with open("tree.dot", encoding='utf-8') as f:
        dot_graph = f.read()
        graph = graphviz.Source(dot_graph.replace("helvetica", "FangSong"))
    graph.view()
    

    リファレンス
  • 決定木sklearnでの実現–実戦ワイン分類事例
  • Graphvizピクチャーは中国語の文字化けしの問題を表示します