KaggleゴールドメダリストのPythonデータマイニングフレームワーク、機械学習の基本プロセスが明確に説明されています

著者| Liu Zaoqi

ソース|初期のPython

はじめに:多くの学生は機械学習を学習するときに、本やビデオを読むことの穴に陥ることがありますが、実際のプロジェクトトレーニングの穴はありません。練習したいが、完全なチュートリアルを見つけることができない場合があります。このプロジェクトはkaggleエントリから翻訳されますプロジェクトTitanic Gold Medal Winner Kernel、この記事では、誰もが知っているTitanicデータセットを通じて問題を分析する方法、データの前処理、モデルの構築、特徴の選択、モデルの評価と改善を詳細に紹介しています。優れたチュートリアル。

この記事では、翻訳中にいくつかの紹介文を削除し、誰でも読みやすいように構造を調整しました。スペース上の理由により、この記事にはコードの大きなセクションは含まれていません。プロセスと結果のみが保持されています。完全に再現するには、記事の最後でノートブックのバージョンとデータセットを入手することをお勧めします。機械学習の入門段階にいる場合は、何かが得られると思います。

プロジェクトの背景と分析

タイタニック号の沈没は、歴史上最も有名な難破船の1つです。1912年4月15日、タイタニック号の最初の航海中に、氷山に衝突して沈没し、2,224人の乗客と乗組員のうち1502人が死亡しました。このセンセーショナルな悲劇は国際社会に衝撃を与えました。

難破船事故で人命が失われた理由の1つは、乗客と乗組員のための十分な救命ボートがないことです。沈没を乗り越えるには運がいくらかあるが、特定のグループは、女性、子供、上流階級などの他のグループよりも生き残る可能性が高い。

このプロジェクトでは、生き残る可能性のある人口の分析を完了するよう求められました。また、機械学習ツールを使用して、どの乗客が悲劇を乗り切ることができるかを予測する必要があります。


データの読み取りと検査

まず、データ処理に関連するライブラリをインポートし、バージョンとデータフォルダを確認します

#导入相关库
import sys 
print("Python version: {}". format(sys.version))
import pandas as pd 
print("pandas version: {}". format(pd.__version__))
import matplotlib 
print("matplotlib version: {}". format(matplotlib.__version__))
import numpy as np 
print("NumPy version: {}". format(np.__version__))
import scipy as sp 
print("SciPy version: {}". format(sp.__version__)) 
import IPython
from IPython import display 
print("IPython version: {}". format(IPython.__version__)) 
import sklearn 
print("scikit-learn version: {}". format(sklearn.__version__))


import random
import time
#忽略警号
import warnings
warnings.filterwarnings('ignore')
print('-'*25)
# 将三个数据文件放入主目录下 
from subprocess import check_output
print(check_output(["ls"]).decode("utf8"))

次に、モデリングと予測に関連するライブラリをインポートします

#导入建模相关库
from sklearn import svm, tree, linear_model, neighbors, naive_bayes, ensemble, discriminant_analysis, gaussian_process
from xgboost import XGBClassifier


from sklearn.preprocessing import OneHotEncoder, LabelEncoder
from sklearn import feature_selection
from sklearn import model_selection
from sklearn import metrics


import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.pylab as pylab
import seaborn as sns
from pandas.tools.plotting import scatter_matrix


#可视化相关设置
%matplotlib inline
mpl.style.use('ggplot')
sns.set_style('white')
pylab.rcParams['figure.figsize'] = 12,8

次に、データの予備プレビューを読んで実行するために、info()関数とsample()関数を使用して、変数のデータ型の概要をすばやく取得します。

data_raw = pd.read_csv('train.csv')
data_val  = pd.read_csv('test.csv')


data1 = data_raw.copy(deep = True)
data_cleaner = [data1, data_val]


print (data_raw.info()) 
data_raw.sample(10)


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
None
  • 生存変数は、結果または従属変数です。これは、バイナリノミナルデータ型の1サバイバーであり、0はサバイバルしません。他のすべての変数は、潜在的な予測子または独立変数です。より多くの予測子がより良いモデルを形成するのではなく、正しい変数を形成することに注意することが重要です。

  • 乗客IDとチケット変数はランダムな一意の識別子であると想定され、結果変数には影響しません。したがって、それらは分析から除外されます。

  • Pclass変数は、チケットカテゴリの序数データであり、社会経済的ステータス(SES)を表します。1=上位クラス、2 =中間クラス、3 =下位クラスを表します。

  • Name変数は、名目上のデータ型です。特徴抽出では、性別は肩書き、家族のサイズ、姓から取得できます。たとえば、SESは医師またはマスターから判断できます。これらの変数はすでに存在しているため、タイトル(マスターなど)が影響を与えるかどうかを確認するために使用します。

  • 性別変数と負荷変数は、名目上のデータ型です。それらは数学的計算のためにダミー変数に変換されます。

  • 年齢とコストの変数は、連続的な定量データタイプです。

  • SIBSPは船に関連する兄弟/配偶者の数を表し、PARCHはアップロードされた親/子の数を表します。どちらも離散的な定量データタイプです。これにより、特徴エンジニアリングで世帯のサイズに関する変数を作成できます。

  • キャビン変数は公称データ型であり、フィーチャーエンジニアリングで、事故が発生したときの船のおおよその位置と甲板上の位置を記述するために使用できます。ただし、null値は多数あるため、値は増加せず、分析から除外されます。


データの前処理

このセクションでは、データクリーニング4cの原則について説明します

  • 訂正

  • 充填(完了)

  • 作成(作成)

  • 変換(変換)


データ修正

データを確認すると、異常または許容できないデータ入力はありません。さらに、年齢と運賃に潜在的な外れ値がある可能性があることもわかりました。ただし、これらは妥当な値であるため、探索的分析が完了するまで待ってから、データセットに含めるか除外するかを決定します。年齢が80ではなく800のように不合理な値である場合、修復は安全な決定です。ただし、正確なモデルを作成する必要がある場合があるため、元の値からデータを変更する場合は、さらに注意が必要です。


欠損値の塗りつぶし

キャビンと出発エリアの年齢、null値、または欠落データ。一部のアルゴリズムはnull値の処理方法を認識していないため失敗するため、欠損値は悪い場合があります。他の決定木などはnull値を処理できます。したがって、複数のモデルを比較対照するため、モデリングを開始する前に修復することが重要です。2つの一般的な方法があります。つまり、レコードを削除するか、または適切な入力を使用して欠損値を埋めます。不完全なレコードを表していない限り、このレコード、特にほとんどのレコードを削除することはお勧めしません。代わりに、欠損値を推定することをお勧めします。定性的データの基本的な方法は、使用パターンを推定することです。定量的データの基本的な方法は、平均、中央値または平均+ランダムな標準偏差の推定を使用することです。中間的な方法は、特定の基準に従って基本的な方法を使用することです。たとえば、平均年齢をクラスで除算したり、運賃とSESで出港したりします。より洗練された方法がありますが、展開する前に、基本モデルと比較して、複雑さが本当に価値を追加するかどうかを判断する必要があります。このデータセットでは、年齢は中央値で推定され、キャビン属性は削除され、搭乗はモードで推定されます。以降のモデルの反復では、この決定を変更して、モデルの精度を向上させるかどうかを決定します。


データの作成と変換


データ作成

機能エンジニアリングとは、既存の機能を使用して新しい機能を作成し、結果を予測するための新しい信号を提供するかどうかを判断することです。このデータセットでは、生存に役割を果たすかどうかを決定するタイトル関数を作成します。

データ変換

最後に重要なことですが、データ形式を変換します。このデータセットでは、オブジェクトのデータ型をカテゴリカルダミー変数に変換します。

print('Train columns with null values:\n', data1.isnull().sum())
print("-"*10)


print('Test/Validation columns with null values:\n', data_val.isnull().sum())
print("-"*10)


data_raw.describe(include = 'all')

クリーニングを開始

この手順を完了するには、次のパンダ機能をある程度理解している必要があります

  • pandas.DataFrame

  • pandas.DataFrame.info

  • pandas.DataFrame.describe

  • データのインデックス作成と選択

  • pandas.isnull

  • pandas.DataFrame.sum

  • pandas.DataFrame.mode

  • pandas.DataFrame.copy

  • pandas.DataFrame.fillna

  • pandas.DataFrame.drop

  • pandas.Series.value_counts

  • pandas.DataFrame.loc

###缺失值处理
for dataset in data_cleaner:    
    #用中位数填充
    dataset['Age'].fillna(dataset['Age'].median(), inplace = True)
    dataset['Embarked'].fillna(dataset['Embarked'].mode()[0], inplace = True)
    dataset['Fare'].fillna(dataset['Fare'].median(), inplace = True)
    
#删除部分数据
drop_column = ['PassengerId','Cabin', 'Ticket']
data1.drop(drop_column, axis=1, inplace = True)


print(data1.isnull().sum())
print("-"*10)
print(data_val.isnull().sum())

次に、数学的分析のために、カテゴリデータをダミー変数に変換します。カテゴリー変数をエンコードする方法は複数あります。このステップでは、データのX(独立/機能/説明/予測/ etc)およびY(依存/ターゲット/結果/応答/その他)変数も定義しますモデリング。

label = LabelEncoder()
for dataset in data_cleaner:    
    dataset['Sex_Code'] = label.fit_transform(dataset['Sex'])
    dataset['Embarked_Code'] = label.fit_transform(dataset['Embarked'])
    dataset['Title_Code'] = label.fit_transform(dataset['Title'])
    dataset['AgeBin_Code'] = label.fit_transform(dataset['AgeBin'])
    dataset['FareBin_Code'] = label.fit_transform(dataset['FareBin'])


Target = ['Survived']


data1_x = ['Sex','Pclass', 'Embarked', 'Title','SibSp', 'Parch', 'Age', 'Fare', 'FamilySize', 'IsAlone'] #pretty name/values for charts
data1_x_calc = ['Sex_Code','Pclass', 'Embarked_Code', 'Title_Code','SibSp', 'Parch', 'Age', 'Fare'] #coded for algorithm calculation
data1_xy =  Target + data1_x
print('Original X Y: ', data1_xy, '\n')
#为原始特征定义x变量以删除连续变量
data1_x_bin = ['Sex_Code','Pclass', 'Embarked_Code', 'Title_Code', 'FamilySize', 'AgeBin_Code', 'FareBin_Code']
data1_xy_bin = Target + data1_x_bin
print('Bin X Y: ', data1_xy_bin, '\n')


data1_dummy = pd.get_dummies(data1[data1_x])
data1_x_dummy = data1_dummy.columns.tolist()
data1_xy_dummy = Target + data1_x_dummy
print('Dummy X Y: ', data1_xy_dummy, '\n')


data1_dummy.head()

基本的にデータのクリーニングが完了したので、もう一度確認してみましょう

print('Train columns with null values: \n', data1.isnull().sum())
print("-"*10)
print (data1.info())
print("-"*10)


print('Test/Validation columns with null values: \n', data_val.isnull().sum())
print("-"*10)
print (data_val.info())
print("-"*10)


data_raw.describe(include = 'all')

划分测试集与训练集

前述のように、提供されるテストファイルは、実際にはコンテストから提出された検証データです。したがって、関数sklearnを使用して、トレーニングデータを2つのデータセットに分割します。これはモデルに適合しません。

train1_x, test1_x, train1_y, test1_y = model_selection.train_test_split(data1[data1_x_calc], data1[Target], random_state = 0)
train1_x_bin, test1_x_bin, train1_y_bin, test1_y_bin = model_selection.train_test_split(data1[data1_x_bin], data1[Target] , random_state = 0)
train1_x_dummy, test1_x_dummy, train1_y_dummy, test1_y_dummy = model_selection.train_test_split(data1_dummy[data1_x_dummy], data1[Target], random_state = 0)


print("Data1 Shape: {}".format(data1.shape))
print("Train1 Shape: {}".format(train1_x.shape))
print("Test1 Shape: {}".format(test1_x.shape))


train1_x_bin.head()

探索性分析

これでデータが整理されたので、変数を記述および要約するための説明的およびグラフィカルな統計を使用してデータを探索します。この段階で、機能を分類し、それらとターゲット変数との相互関係を決定します。

for x in data1_x:
    if data1[x].dtype != 'float64' :
        print('Survival Correlation by:', x)
        print(data1[[x, Target[0]]].groupby(x, as_index=False).mean())
        print('-'*10, '\n')
        
print(pd.crosstab(data1['Title'],data1[Target[0]]))

次はいくつかの視覚分析です。最初に、各ラベルの異なる固有値の生存結果の比較を調べます

クラスは生存に重要であることを知っているので、次に、異なるクラスの特性を比較してみましょう

それは図から見ることができます:1)キャビンクラスが高いほど、運賃は高くなります。2)キャビンクラスが高い人は比較的高齢です。3)キャビンレベルが高いほど、家族旅行者の数は少なくなります。死亡率はキャビンクラスとはほとんど関係がありません。また、生存には性別が重要であることを知っています。次に、性別と2番目の特性を比較してみましょう。

女性の生存率が男性の生存率よりも高く、Cデッキと一人旅の女性の生存率が高いことがわかります。

次に、生き残っているまたは生きていない乗客の年齢分布をプロットします

生存者の性別と年齢のヒストグラムを描く

最後に、データセット全体を視覚化します


モデリング分析

まず、機械学習の目的は人間の問題を解決することであることを理解する必要があります。機械学習は、教師あり学習、教師なし学習、強化学習に分類できます。教師あり学習では、正しい解答を含むトレーニングデータセットをモデルに提供することで、モデルをトレーニングできます。教師なし学習では、正しい答えを含まないトレーニングデータセットを使用してモデルをトレーニングできます。強化学習は最初の2つの方法を組み合わせたものであり、この場合、モデルは正しい答えをすぐには得ず、一連のイベントの後でのみ得ます。一連の関数とそれに対応する目標を示すことでアルゴリズムをトレーニングしているため、教師あり機械学習を行っています。次に、同じデータセットからの新しいサブセットを提供し、予測精度の点で同様の結果が得られるようにしたいと考えています。

多くの機械学習アルゴリズムがありますが、さまざまなターゲット変数とデータモデリングの目標に応じて、分類、回帰、クラスタリング、次元削減の4つのカテゴリに分類できます。分類と回帰に焦点を当てます。簡単に言えば、連続ターゲット変数には回帰アルゴリズムが必要ですが、離散ターゲット変数には分類アルゴリズムが必要です。;また、ロジスティック回帰はその名前に回帰がありますが、実際には分類アルゴリズムです。私たちの問題は乗客が生き残るかどうかを予測することなので、これは個別のターゲット変数です。sklearnライブラリの分類アルゴリズムを使用して、分析を開始します。そして、交差検証とスコアリングメトリック(後のセクションで説明)を使用して、アルゴリズムのパフォーマンスをランク付けして比較します。

一般的な機械学習分類アルゴリズムは

  • EM法

  • 一般化線形モデル(GLM)

  • ナイーブベイズ

  • K隣人

  • サポートベクターマシン(SVM)

  • 決定木

以下では、異なる方法を使用して比較します(コードが長すぎるため、バックグラウンドでkaggleに返信して、詳細なコードのソースコードを取得してください)


モデル評価

要約すると、いくつかの基本的なデータのクリーニング、分析、機械学習アルゴリズム(MLA)を通じて、乗客の生存率を約82%の精度で予測することができました。数行のコードは悪くありません。しかし、私たちが常に尋ねる質問は、より良いことを行うことができ、さらに重要なことには、投資した時間に投資した投資収益率を得ることができるかということです。たとえば、精度を1%だけ上げる場合、3か月の開発に本当に価値があるのでしょうか。したがって、モデルを改善するときは、このことを覚えておいてください。

モデルを改善する方法を決定する前に、モデルを維持する価値があるかどうかを判断しましょう。そのためには、データサイエンス101の基本に戻る必要があります。考えられる結果は2つしかないため、これはバイナリ問題であることはわかっています。乗客は生き残ったか、死亡した。コイン投げの問題だと考えてください。コインを持っていて、表か裏かを当てると、50から50の確率で当てることができます。したがって、モデルの最悪のパフォーマンスとして50%を設定しました。

まあ、データセットに関する情報がなければ、常に50%のバイナリ問題が発生する可能性があります。しかし、データセットに関する情報があるので、もっとうまくできるはずです。1502/2224、つまり67.5%の人が亡くなったことがわかっています。したがって、最も高い確率を予測した場合、100%の人が死亡することになります。この場合、予測は67.5%の確率で正確です。では、68%をモデルのパフォーマンスが悪いと考えてみましょう。これより低いモデルは無意味です。すべてのオブジェクトが死ぬことを予測できます。

次に、交差検証を使用してモデルを評価します。

これは純粋に手作りのモデルであり、学習を目的としています。凝ったアルゴリズムなしで独自の予測モデルを作成できます。1は生存、0は死を意味します

Coin Flip Model Accuracy: 49.49%
Coin Flip Model Accuracy w/SciKit: 49.49%

結果を要約する

Survival Decision Tree w/Female Node: 
 Sex     Pclass  Embarked  FareBin        
female  1       C         (14.454, 31.0]     0.666667
                          (31.0, 512.329]    1.000000
                Q         (31.0, 512.329]    1.000000
                S         (14.454, 31.0]     1.000000
                          (31.0, 512.329]    0.955556
        2       C         (7.91, 14.454]     1.000000
                          (14.454, 31.0]     1.000000
                          (31.0, 512.329]    1.000000
                Q         (7.91, 14.454]     1.000000
                S         (7.91, 14.454]     0.875000
                          (14.454, 31.0]     0.916667
                          (31.0, 512.329]    1.000000
        3       C         (-0.001, 7.91]     1.000000
                          (7.91, 14.454]     0.428571
                          (14.454, 31.0]     0.666667
                Q         (-0.001, 7.91]     0.750000
                          (7.91, 14.454]     0.500000
                          (14.454, 31.0]     0.714286
                S         (-0.001, 7.91]     0.533333
                          (7.91, 14.454]     0.448276
                          (14.454, 31.0]     0.357143
                          (31.0, 512.329]    0.125000

決定木を使用して、関連するメトリックをモデル化して表示する

Decision Tree Model Accuracy/Precision Score: 82.04%


              precision    recall  f1-score   support


           0       0.82      0.91      0.86       549
           1       0.82      0.68      0.75       342


    accuracy                           0.82       891
   macro avg       0.82      0.79      0.80       891
weighted avg       0.82      0.82      0.82       891

正解率は82%で、結果は以下に視覚化されていることがわかります


相互検証

次は交差検証ですが、重要なことは、異なるサブセットを使用してデータをトレーニングしてモデルを構築し、テストデータを使用してモデルを評価することです。そうしないと、モデルがオーバーフィットします。これは、すでに表示されているデータを「予測する」という点では優れていますが、まだ表示されていないデータを予測するという点ではひどいことを意味します。これはまったく予測ではありません。学校のテストで不正行為をして100%のスコアを取得するようなものですが、テストを受けに行くと失敗します。

CVは基本的に、モデルを複数回分割してスコアリングするショートカットであるため、目に見えないデータに対してモデルがどのように機能するかを理解できます。コンピュータ処理の方が高価ですが、非常に重要であるため、誤った信頼はありません。これは、Kaggleのコンテストや、一貫性や驚きを回避するあらゆるユースケースで役立ちます。


ハイパーパラメーター調整

sklearnデシジョンツリー(DT)分類子を使用したとき、すべての機能のデフォルトを受け入れました。これにより、さまざまなハイパーパラメータ設定がモデルの精度をどのように変化させるかを理解する機会が得られます。(パラメーターとハイパーパラメーターの詳細については、ここをクリックしてください。)

ただし、モデルを調整するには、実際にモデルを理解する必要があります。これが、前のセクションで時間をかけて予測の原理を説明した理由です。そのため、ディシジョンツリーアルゴリズムの利点と欠点を詳細に理解する必要があります。

以下は、ParameterGrid、GridSearchCV、およびcustomizedsklearnスコアリングスコアリングを使用してモデルの結果を調整することです

BEFORE DT Parameters:  {'ccp_alpha': 0.0, 'class_weight': None, 'criterion': 'gini', 'max_depth': None, 'max_features': None, 'max_leaf_nodes': None, 'min_impurity_decrease': 0.0, 'min_impurity_split': None, 'min_samples_leaf': 1, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'presort': 'deprecated', 'random_state': 0, 'splitter': 'best'}
BEFORE DT Training w/bin score mean: 82.09
BEFORE DT Test w/bin score mean: 82.09
BEFORE DT Test w/bin score 3*std: +/- 5.57
----------
AFTER DT Parameters:  {'criterion': 'gini', 'max_depth': 4, 'random_state': 0}
AFTER DT Training w/bin score mean: 87.40
AFTER DT Test w/bin score mean: 87.40
AFTER DT Test w/bin score 3*std: +/- 5.00

特征选择

最初に述べたように、予測子の数が多いほどモデルが優れているというわけではありませんが、正しい予測子がモデルの精度を向上させることができます。したがって、データモデリングのもう1つのステップは、特徴の選択です。Sklearnでは、再帰的機能除去(RFE)と交差検証(CV)を使用します

ここにいくつかの結果があります

BEFORE DT RFE Training Shape Old:  (891, 7)
BEFORE DT RFE Training Columns Old:  ['Sex_Code' 'Pclass' 'Embarked_Code' 'Title_Code' 'FamilySize'
 'AgeBin_Code' 'FareBin_Code']
BEFORE DT RFE Training w/bin score mean: 82.09
BEFORE DT RFE Test w/bin score mean: 82.09
BEFORE DT RFE Test w/bin score 3*std: +/- 5.57
----------
AFTER DT RFE Training Shape New:  (891, 6)
AFTER DT RFE Training Columns New:  ['Sex_Code' 'Pclass' 'Title_Code' 'FamilySize' 'AgeBin_Code'
 'FareBin_Code']
AFTER DT RFE Training w/bin score mean: 83.06
AFTER DT RFE Test w/bin score mean: 83.06
AFTER DT RFE Test w/bin score 3*std: +/- 6.22
----------
AFTER DT RFE Tuned Parameters:  {'criterion': 'gini', 'max_depth': 4, 'random_state': 0}
AFTER DT RFE Tuned Training w/bin score mean: 87.34
AFTER DT RFE Tuned Test w/bin score mean: 87.34
AFTER DT RFE Tuned Test w/bin score 3*std: +/- 6.21
----------

模型验证

最初に異なるアルゴリズムを比較する

次に、投票してモデルを選択します

Hard Voting Training w/bin score mean: 86.59
Hard Voting Test w/bin score mean: 82.39
Hard Voting Test w/bin score 3*std: +/- 4.95
----------
Soft Voting Training w/bin score mean: 87.15
Soft Voting Test w/bin score mean: 82.35
Soft Voting Test w/bin score 3*std: +/- 4.85
----------

同じ操作をもう一度実行すると、最終的に保持される変数と結果は次のようになります。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 21 columns):
PassengerId      418 non-null int64
Pclass           418 non-null int64
Name             418 non-null object
Sex              418 non-null object
Age              418 non-null float64
SibSp            418 non-null int64
Parch            418 non-null int64
Ticket           418 non-null object
Fare             418 non-null float64
Cabin            91 non-null object
Embarked         418 non-null object
FamilySize       418 non-null int64
IsAlone          418 non-null int64
Title            418 non-null object
FareBin          418 non-null category
AgeBin           418 non-null category
Sex_Code         418 non-null int64
Embarked_Code    418 non-null int64
Title_Code       418 non-null int64
AgeBin_Code      418 non-null int64
FareBin_Code     418 non-null int64
dtypes: category(2), float64(2), int64(11), object(6)
memory usage: 63.1+ KB
None
----------
Validation Data Distribution: 
 0    0.633971
1    0.366029
Name: Survived, dtype: float64

总结

最終的に、精度が0.77990のモデルが得られました。同じデータセットと異なるデシジョンツリーの実装(adaboost、ランダムフォレスト、グラディエントブースト、xgboostなど)を使用して調整しても、送信精度が0.77990を超えることはありません。このデータセットの場合、興味深いのは、単純な決定木アルゴリズムがデフォルトの提出スコアが最も高く、チューニングによって同じ最高精度スコアが得られることです。

また、単一のデータセットでいくつかのアルゴリズムをテストしても同じ結果は得られませんが、前述のデータセットにはいくつかの観察があります。同時に、トレーニングデータセットの分布は、テスト/検証データセットおよび充填データセットとは異なります。これにより、相互検証(CV)の精度スコアとKaggleによって提出された精度スコアの間に大きなギャップが生じます。同じデータセットの場合、決定木ベースのアルゴリズムは、適切な調整後に同じ精度スコアに収束するようです。

CVスコアとKaggleスコアをより適切に調整し、全体的な精度を向上させるために、前処理と機能エンジニアリングで後でより多くの処理を行うことができます。これらは、関心のある読者が完了する必要があります。

更多精彩推荐

おすすめ

転載: blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/108764667