機械学習 - プロセスの概要

Kaggleので、このサイトは、計画のグランドマスターになったので、最近では、唯一の機械学習を研究しても議題と呼ばれていました。

競技のカップルを行った後、徐々に機械学習のルーチンをまとめ始めます。

あなたは3つの非常に重要なポイントを持っているまず、データ・サイエンス、:

  1.  データの知識は特に重要です。それ自体で、データとデータの間の関係、研究データの特性は、我々はインスピレーションをもたらすために仕事の後に与える傾向があります。
  2. 特集・エンジニアリングは、特に重要です。私たちは、この機能の導入は、あなたのスコアで非常に大幅な増加となります後、ある魔法の機能と呼ばれる用語を、持っています。ある程度自分のランキングを向上させる私たちを助けることができる機能のエンジニアはそう。
  3. モデルアンサンブルは特に重要です。我々は、すべてのラインとベースラインモデルは、特に簡単なことである知っているので、我々はスコアのベースラインモデルを実現することができます。すべてのトリック、あなたのランキング、1つのフィーチャーエンジニアリング最も明白な増加では、モデルのアンサンブルがあります。

これは、私たちの機械学習の基本的なプロセスを見てみましょう、我々はkaggleのマッチポイントの前に知っておく必要がありということができます。

 

一. EDA

(1)。全体として、あなたのデータを知っています

まず、いくつかの基本的な概念を理解します:

まず、データは基本的に2つのカテゴリに分割され、数値データおよびカテゴリデータ前者はに分けることができ離散値連続値

その上平均、STD、最大と最小と:数値データの場合は、彼はユニークな特徴を持っています。私たちはできるパンダの方法を説明使用説明するが。

# For numerical data
data_set.describe()

その上で一意、カウント数と:離散データについて、彼はユニークな特徴を持っています。我々はまだできパンダの方法を説明説明するが。

# For continuous data
data_set.describe(include=["O"])    # 注意这里是大写的O

パンダは、個人的には、データが時に、欠損値を処理するための最も強力なパッケージだと思うし、この後、あなたは前処理、単純なデータに出くわします。そこに最終的に欠損値の数を得るためには、各タイプの特徴が何であるか、我々はできる情報のメソッドを使用するビューに。

# See if there is any missing value
data_set.info()

いくつかの具体的な質問では、我々は、この実装の適切な配分を知っている必要があり、我々は、本当に非常に簡単です達成するために+プロットデータフレームオブジェクトvalue_countsを使用することができます。

train_set.Survived.value_counts().plot(kind='bar')

これらはあなたのデータを理解するための非常に簡単な方法です。それはipynbも非常に良いされている場合、私は、もちろん、REPL環境でこのipython取得をお勧めします、強い場所ipynbは、彼が実行した後(ライン実行することにより、他のREPL環境からの)ブロック内のコードの実行を可能にするだけでなく、ということですコードの次の部分も(Pycharm等IDEとは異なる)の再訓練なしで実行された場合、対応する結果を保存します。だから私は強くお勧めします。

(2)データおよびデータ間の関係を理解し​​ます

後で、全体的なデータの特性のいくつかを見るとき、あなたはおそらく、選択する最後の特徴の少しの仮定を持って、次のようにしなければならない実際にこれらの仮定を伝えています。ここでは、両方のことができ、使用DATAFRAME方法も使用することができます我々の結果は、画像でmatplotlibのかSeaborn示すこと

ここでKaggleのHello World競争のレベルに - ここでは例として、タイタニック号。私たちは、性別や年齢を推測し、最後に生き残った成果ではありませんので、我々は、最初のカジュアルな作業女性と子供から知っています。

典型的であるような、性別などカテゴリーデータ、非常に優れたAPIを提供しPanads - GROUPBY、それはGROUPBYオブジェクトを作成し、我々はこのテーマに様々な方法のGROUPBYを使用してすることができ、対応するカテゴリの下に統計情報を参照してください

# Groupby method creates a group object
# ax_index format the data frame
train_set[["Sex", "Survived"]].groupby(["Sex"], as_index=False).mean()

カテゴリデータのために、また、可視化の好ましい方法では、積層内=真をmatplotlibの中に設定されています。

Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
df=pd.DataFrame({'Survived':Survived_1, 'Unsurvived':Survived_0})
df.plot(kind='bar', stacked=True)

子供が優先され、この問題を逃れるなどタイタニックのように-彼は離散数値データであるように思われるが、具体的な問題よりも頻繁ではないが、年齢の値に依存しますが、年齢区分にもよるが、年齢は、また、非常に典型的な特徴でありますレベルは、その後、我々は、セグメントの子供の年齢に分割されます、この機能は、エンジニアリングで呼び出され、その他のワイドビニング方法(もちろん、今も作品が何を急いではありませんています)

私たちは、最初に処理されるべき数値データとして年齢の、これは、我々はまだそれを見ることhistgramを使用して、データフレームの観察にこれを置くことのようなGROUPBYを使用することはできません。

特定の用語の分布、私はこの時間は、我々は二つのマップを必要とし、Unsurvived年齢と年齢分布を乗り切るしたい、とここで私はFacetGrid Seabornメソッドを使用することをお勧めします APIの複数のサブグラフは混沌とmatplotlibのであるから、そして、理解するのが難しいです。

g = sns.FacetGrid(train_set, col='Survived')
g.map(plt.hist, 'Age', bins=20)

あなたは、同時に複数の変数を勉強したい場合は、私たちのFacetGridもサポート。私たちが先頭にsns.setを追加することもできます()または色相の属性の導入は、(基本的に私はモードは、紙のようにいっぱいですカウント)私たちのマップをより魅力的にします。

# 在不同社会等级下,男性和女性在不同登陆港口下的数量对比
grid = sns.FacetGrid(train_set, col='Pclass', hue='Sex', palette='seismic', size=4)
grid.map(sns.countplot, 'Embarked', alpha=.8)
grid.add_legend() 

 

II。データの前処理

3つのことを行うために、主に前処理データ:

  1.  欠損値を扱います。値は扱っていない場合は明らかに、我々は、次の作業を行うことが困難になります。
  2.  フィーチャー作品。エンジニアリング特性と一般的に私が最終決定権を置く特徴選択と建設の機能に分けることができます。
  3.  標準化とコーディング。一般的に私たちの数値の値が比較的大きい、収束は我々が標準化する必要があるので、それは範囲が限定され、我々のモデルに非常に良いではありません。私たちのカテゴリ値については、一般的に我々は、機能文字列のいくつかのタイプのために、私たちはエンコードする必要があり、実際には、ワンホットエンコーディングを選択します。

(1)の処理欠損値

欠損値の処理方法は、多すぎるポータル一般的には、特定の問題を分析することです。パンダは欠損値を処理するためのAPIの多くを提供する前にも言及することは、例えば、したい欠損値を埋めるために平均を使用するには、次のステートメントを使用することができます。

test_df['Fare'].fillna(test_df['Fare'].dropna().median(), inplace=True)

あなたがもし新しいカテゴリとして欠損値をしたいです

# 这里如果先填充缺失值,那么所有的数据都会变成"yes",想一想是为什么
df.loc[df.Cabin.notna(), "Cabin"] = "yes"
df.loc[df.Cabin.isna(), "Cabin"] = "no"

この後、私は、ボーエンの適切な要約を行います。

(2)標準エンコーディング

これは例えば、私の下にStandardScalerの前処理を選んだこのsklearnで多く、で、それは数値データであれば、それは標準化されたアルゴリズムを使用することで、非常にはっきり言われています前に:

    df["Age"] = StandardScaler().fit_transform(df["Age"].to_frame())

カテゴリデータは、その後、ワンホットエンコーディング(もちろん、あなたが他のエンコーディングを使用することができるが、例えば、シーケンスは、エンコード、またはバイナリエンコーディング、および他の符号化方式)を使用し、PANDASにAPIがワンホットで直接エンコードされていがない場合は、get_dummiesと呼ばれていますこれは、元のデータフレームに新しい機能を作成し、以下を参照します。

features = ["Cabin", "Embarked", "Sex", "Pclass", "Title"]
one_hot_category = []
for feature in features:
    dummies = pd.get_dummies(df[feature], prefix=feature)
    one_hot_category.append(dummies)
# 拼接的具体方法是讲新的数据和原来的数据拼接,然而再扔掉旧的
df = pd.concat([df, *one_hot_category], axis=1)
df = df.drop(features, axis=1)

 

III。モデリングと予測

これは最も重要な一部であるように見えますが、そこsklearnコールが単純すぎるので、私は、話すというではないでしょう。何のモデルについては、実際には、どのような最後のモデルのアンサンブルがそうするように特別にどのように、モデルのさまざまな統合する際にベースラインモデルは、とにかく、問題ではないことは、最終的なモデルのアンサンブルを参照してくださいする必要があります。

 

IV。図面の学習曲線

私たちの学習曲線に専念するcoursaにAngrew NG。彼は、学習曲線が収束の我々のモデルかどうかを判断するために設計されていました。私たちは与えられたモデル収束しないをsklearn場合は実際には、それは警告を与えられるべきです。しかし、私はオフシールド次の警告文を持っています:

import warnings
warnings.filterwarnings("ignore")

トレーニングsklearnのモデルとして、我々は、彼らがメトリックのリストに話しているときに、すべてのトレーニングをリストとして定義され、どの我々は、ニューラルネットワークを訓練したくないことを意味し、目に見えない内部に存在します。幸いsklearnは、次のように使用learning_curveパッケージを提供してくれます。

# 盲猜这个train_size是训练次数,至于这个train_score和这个test_score难道是不同训练下的答案
train_sizes, train_scores, test_scores = learning_curve(
    estimator, X, y, cv=None, train_sizes=np.linspace(0.05, 1, 20)
)
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)

# train_size是训练的样本数,fill_between还要额外接受两个参数(上限和下限)
# 注意fill_between要设置透明度, 不然就直接和learning_curve混在一起了
plt.fill_between(train_sizes, train_scores_mean - train_scores_std,         
train_scores_mean + train_scores_std, alpha=0.1, color="b")
plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha=0.1, color="r")
plt.plot(train_sizes, train_scores_mean, "o-", color="b")
plt.plot(train_sizes, test_scores_mean, "o-", color="r")
plt.show()

図Fill_between matplotlibの方法は、非常に良好な結果と混合平均および標準偏差を言うに使用しました。

 

III。プロジェクトが特徴

フィーチャープロジェクトは、単純な作業ではありません、もちろん、始めましょタスクとして、私は彼と一緒に単純な対処します。

(1)数値转カテゴリ

それは我々が前述の等幅ビニング方法です。あなたは彼が私たちを助けて準備ができていた、パンダ本当に強い、でも幅ビニング、言うことはありません。

train_df['AgeBand'] = pd.cut(train_df['Age'], 5)

次のように我々は5つの均等に広い範囲を持って、この時間は、直接分析のために我々のモデルの範囲のために明確には適していません、私たちは、対応するカテゴリの特徴に変換しました:

 df.loc[df["Age"] <= 16, "Age"] = 0
 df.loc[(df["Age"] > 16) & (df["Age"] <= 32), "Age"] = 1
 df.loc[(df["Age"] > 32) & (df["Age"] <= 48), "Age"] = 2
 df.loc[(df["Age"] > 48) & (df["Age"] <= 64), "Age"] = 3
 df.loc[df["Age"] > 64, "Age"] = 4

numpyの少し技術がここで使用される、中間&起因とシリーズオブジェクト数値比較は、ブール配列を返し、配列を使用することができず、簡単なロジックなどのオペレータに接続されています。そして、これは&超える過負荷の結果であり、それは要素毎の積を示しています。この新しい配列で、我々はすべての行がTrueで取得することができます。

(2)タイプ文字列

タイタニック文字列から情報を抽出するのは非常に良い例があります。彼の名前は、コールにプレフィックス番号から抽出されます。もちろん、我々は、文字列に扱う正規表現の選択肢ですが、組み込みのstrがまた非常に良い方法があります。

df['Title'] = df.Name.str.extract(' ([A-Za-z]+)\.', expand=False)
df['Title'] = df['Title'].replace(['Lady', 'Countess', 'Capt', 'Col',
                                   'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
df['Title'] = df['Title'].replace('Mlle', 'Miss')
df['Title'] = df['Title'].replace('Ms', 'Miss')
df['Title'] = df['Title'].replace('Mme', 'Mrs')
df = df.drop("Name", axis=1)

この機能は、それの角部のみ、特定の作品を見ポータルを

 

IV。モデル統合

:ほとんど知ら説明ポータル Kaggleの説明;:ポータル

実際の統合モデルは非常に複雑ですが、私はこの完了後になります。ここでは、単に統合の単純なモデルを行うには、パッケージの内側にsklearnを使用しています。

それとも例えばタイタニック、に分類問題なので、我々は統合され、対応する分類器を選択する必要があり、一般的な分類は以下のとおりです。

  1. ロジスティック回帰
  2. サポートベクターマシン
  3. ランダムフォレスト分類器
  4. 単純ベイズ分類器
  5. preceptron(パーセプトロン)
  6. KNN

その後、我々は選択肢がために、共通のVotingClassifierあるシンプルなコールの統合モデルを達成することができるようになります異質モデルを統合します

LR = LogisticRegression(solver="lbfgs", C=1.0, penalty="l2", tol=1e-6)
SVM = SVC(kernel="rbf", C=1)
RF = RandomForestClassifier(n_estimators=20, max_depth=5)
GNB = GaussianNB()
P = Perceptron()
KNN = KNeighborsClassifier(n_neighbors=3)
model = VotingClassifier([("lr", LR), ("svm", SVM), ("gnb", GNB), ("rf", RF), ("p", P), ("knn", KNN)])
model.fit(X, y)

ノートへのもう一つのポイントは関係なく、当社のエンジニアリング機能や統合モデルの、私たちはモデルスコアが上昇していることを確認することができない、ということです。我々はまた、独自のCVに評価する必要があります。

Kaggleに多くの得点がありますが、我々は非常に遠くマークオフになっています。例えば、回帰問題は、MSEは、実際には別のKNNのK = 1で、次いで溶液は元のデータセットを見つけることであり、これらは実際に過剰適合され、0は、中分類が、精度はさらに100%になります表示され、あろう。この動作は完全に無意味ですが、私たちは私たちのCVに横たわることができません。

print(cross_val_score(model, X, y))

限り私たちの品種の明確な改善があるとして、我々は(確信)の増加に対応するスコアを取得します。

他の方法CV試験:ポータル

 

V.は、結果を提出します

今回の結果は、その後submission->アップロードするには、最初のCSVへの私たちの結果についてのすべての話の、言ったことはなかっただろう。

CSVの道へ - やパンダを通して、to_csvの簡単な方法:

outputs = model.predict(test_set)
result = pd.DataFrame({"PassengerId": range(892, 1310), "Survived": outputs})
result.to_csv("./result.csv", index=False)
# Remind me if over
print("Done!")

 

公開された137元の記事 ウォン称賛19 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_43338695/article/details/103791134