[[205998]] 皆さんのお役に立てれば幸いですので、この投稿を書くのは大変でした。機械学習とデータマイニングの業界背景については紹介しませんし、ロジスティック回帰、SVM、GBDT、ニューラルネットワークなどの学習アルゴリズムの理論的根拠や数学的導出についても具体的に紹介しません。この記事は、機械学習とデータモデリングを手順的にすぐに始められるように支援することに重点を置いています。 この記事は主に 4 つの部分に分かれています (時間の制約により 2 つの部分に分けられます)。 前の: - 準備の部分では、主に環境構築とパンダの基礎知識が必要になります。
- アプリケーションのセクションでは、Kaggle の Titanic を例に、データ ソースの取得、データのクリーニング、機能の処理、モデルの選択、モデルの出力、アプリケーションについて説明します。
次: - 最適化の章では、いくつかの最適化手法を紹介します。
- この記事では、私が気になっているいくつかの疑問を提起し、皆さんの助けを得たいと思っています。
準備 1環境構築 sklearn の実験環境全体は、python 2.7 + pycharm + Anaconda です。 2 パンダの基礎 ここでは、これから使用するパンダの知識のみを紹介します。ご興味があれば、詳しく学んでみてください。参考書として「Python for Data Analysis」をお勧めします。基本的な理解がある方は、直接アプリケーションセクションに進んでください。 Pandas は主に Series と DataFrame という 2 つのデータ構造を使用します。 Series は 1 次元配列に似ていますが、DataFrame は 2 次元のテーブル構造に似ています。 シリーズ構成法: - ラベル=[1,0,1,0,1]
- data = pd.Series(data=label、 index =[ 'a' 、 'b' 、 'c' 、 'd' 、 'e' ]、dtype= int 、 name = "label" )
- 印刷データ
シリーズはインデックスによってデータを取得します - データ[ 'a' ]
- データ[[ 'a' , 'b' ]]
データフレームの構築 (1)辞書形式で構築 - frame = pd.DataFrame({ 'name' :[ 'Time' , 'Jack' , 'Lily' ], 'Age' :[20,30,12], "weight" :[56.7,64.0,50.0]})
(2) DataFrameからDataFrameを構築する - frame1 = pd.DataFrame(frame,columns=[ "名前" , "年齢" ])
フレームから 2 つの列が読み取られ、新しい DataFrame が形成されます。 データフレーム操作 1 列を追加する - フレーム1[ "friends_num" ]=[10,12,14]
2. 列を削除する - frame2 = frame1.drop ([ "名前" , "年齢" ],axis=1 )
3 データ行を見つける - フレーム1[フレーム1[ "friends_num" ]>10]
結果は次のとおりです。 DataFrame の統計手法 1 フレーム 1 の Age 列をセグメント化するなど、列を処理するために lambda を適用します。 - frame1[ "Age_group" ] = frame1[ "Age" ].apply(lambda x: x < 20 の場合は 0、それ以外の場合は1)
2 出力統計情報の説明、非常に強力 - フレーム1.記述()
データ処理に特に役立つ 8 つの統計が提供されます。問題があります。describe メソッドを直接使用すると、数値型の列しかカウントできず、文字変数はカウントできません。パラメータを追加するだけです。 - frame1.describe(include=[ 'O' ])
3. 欠損値の取り扱い - #欠損値を0で埋める
- フレーム1.フィルナ(0)
- #NANを含む行を破棄する
- フレーム1.dropna()
- # すべてのnan行を削除
- frame1.dropna(how= "すべて" )
応用 1 データの読み取り この例では、データ ソースとして Titanic を使用します。添付ファイルでデータを入手できます。 - データ = pd.DataFrame(pd.read_csv(train_path))
- data_test = pd.DataFrame(pd.read_csv(test_path))
- data_test = data_test[[ "Pclass" , "名前" , "性別" , "年齢" , "同胞" , "座席" , "チケット" , "運賃" , "客室" , "搭乗" ]]
- x = data[[ "Pclass" , "Name" , "Sex" , "Age" , "SibSp" , "Parch" , "Ticket" , "Fare" , "Cabin" , "Embarked" ]]
- y = data[[ "生き残った" ]]
- x.describe() を印刷する
- x.describe(include=[ 'O' ])を印刷します。
- data_test.describe() を印刷する
- data_test.describe(include=[ 'O' ])を印刷します。
データの初期統計: 2 データクリーニング 1. 欠損値の処理。 Age 列と Embarked 列には欠損値がいくつかありますが、これらは別々に処理されます。 - #欠損値をモードで埋める
- data_set[ "乗船" ]=data_set[ "乗船" ].fillna( 'S' )
- #年齢の欠損値を平均値で埋める
- data_set[ "年齢" ]=data_set[ "年齢" ].fillna(data_set[ "年齢" ].mean())
2. 欠損率の高い列を削除する(初期処理時) Cabin列の欠落率が75%に達したため、列を削除します。 - data_set = data_set.drop ([ "キャビン" ], axis=1 )
3 特徴処理 特徴処理は特定のデータに基づいて行われるため、特徴処理の前にデータを完全に理解しておく必要があります。特徴処理には決まった方法はありません。主に個人の経験と観察に依存しており、継続的な試行錯誤を通じて、より良い特徴変数を発見したいと考えています。したがって、特徴処理はモデル構築プロセスの中で最も時間がかかり、精神的に疲れるタスクです。 1) 単変量特徴抽出。 - #名前の長さに基づいて、name_len機能を抽象化します
- data_set[ "name_len" ] = data_set[ "Name" ].apply(len)
名前の列を観察する 名前列のデータを観察すると、名前に性別や婚姻状況を含むタイトル情報が見つかります。この情報を抽出します(便利な機能になる可能性があります)。 - data_set[ "name_class" ] = data_set[ "Name" ].apply(lambda x : x.split( "," )[1]).apply(lambda x :x.split()[0])
2) 複数の変数の組み合わせ 兄弟姉妹と配偶者の数を表す パーチは親と子の数を表す したがって、sibsp と parch を組み合わせると、家族のメンバーの数を取得できます。 - データセット[ "family_num" ] = データセット[ "Parch" ] + データセット[ "SibSp" ] +1
3) 名目変数を数値変数に変換する - #乗り出した
- data_set[ "Embarked" ]=data_set[ "Embarked" ].map({ 'S' :1, 'C' :2, 'Q' :3}).astype( int )
- #セックス
- data_set[ "性別" ] = data_set[ "性別" ].apply(lambda x : 0 if x == '男性' それ以外の場合1)
4) データのセグメンテーション 統計と経験に基づくセグメンテーション - #[7.91,14.45,31.0] 運賃統計に基づくセグメンテーション
- data_set[ "運賃" ] = data_set[ "運賃" ].apply(lambda x:cutFeature([7.91,14.45,31.0],x))
- #[18,48,64] 経験に基づくセグメンテーション
- data_set[ "年齢" ] = data_set[ "年齢" ].apply(lambda x:cutFeature([18,48,64],x))
簡単なデータ処理の後、次の 12 次元データが得られます。 4 モデルの選択とテスト 最初に 5 つのモデルがテスト用に選択されました。 ランダムフォレスト分類子 エクストラツリー分類子 アダブースト分類器 勾配ブースティング分類器 SVC モデルパラメータ: - # ランダムフォレスト
- rf_params = {
- 'n_jobs' : -1,
- 'n_estimators' : 500,
- 'warm_start' : True 、
- # '最大機能' : 0.2,
- '最大深度' :6,
- '最小サンプル数' : 2,
- '最大特徴' : '平方根' ,
- '詳細' : 0
- }
- # 追加ツリー ランダムフォレスト
- et_params = {
- 'n_jobs' : -1,
- 'n_estimators' : 500,
- # '最大機能' : 0.5,
- '最大深度' : 8,
- '最小サンプル数' : 2,
- '詳細' : 0
- }
-
- # アダブースト
- ada_params = {
- 'n_estimators' : 500,
- 学習率: 0.75
- }
-
- #GBDT
- gb_params = {
- 'n_estimators' : 500,
- # '最大機能' : 0.2,
- '最大深度' : 5,
- '最小サンプル数' : 2,
- '詳細' : 0
- }
-
- # エスビーシー
- svc_params = {
- 「カーネル」 : 「線形」 、
- 'C' : 0.025
- }
モデル選択コード: - 分類子 = [
- ( "rf_model" 、 RandomForestClassifier(**rf_params))、
- ( "et_model" 、ExtraTreesClassifier(**et_params))、
- ( "ada_model" 、AdaBoostClassifier(**ada_params))、
- ( "gb_model" 、 GradientBoostingClassifier(**gb_params))、
- ( "svc_model" 、SVC(**svc_params))、
- ]
-
- ホールドアウト = [0.95, 0.90, 0.75, 0.50, 0.01]
- ラウンド = 20
- xx = 1. - np.array(heldout)
- のために 分類子のname 、 clf :
- print( "トレーニング %s" % name )
- rng = np.random.RandomState(42)
- yy = []
- heldoutのiの場合:
- yy_ = []
- rが範囲(ラウンド)内である場合:
- X_train_turn、X_test_turn、y_train_turn、y_test_turn = \
- train_test_split(x_train、labels_train、テストサイズ=i、ランダム状態=rng)
- clf.fit(X_train_turn、y_train_turn) を使います。
- y_pred = clf.predict(X_test_turn)
- yy_.append(1 - np.mean(y_pred == y_test_turn))
- yy.append(np.mean(yy_))
- plt.plot(xx, yy, ラベル=名前)
-
- plt.legend(loc= "右上" )
- plt.xlabel( "比例列車" )
- plt.ylabel( "テストエラー率" )
- plt.show()
選考結果は以下の通りです。 上の図からわかるように、randomForest は一般に他のアルゴリズムよりもパフォーマンスが優れています。最初はランダムフォレスト アルゴリズムが選択されます。 トレーニング セットにおけるモデルのパフォーマンス: - モデルスコアを定義します(x_train、labels_train、x_test、y_test、モデル名、et_params):
- print( "--------%s-------------" )%(モデル名)
- モデル = モデル名(**et_params)
-
- モデルをフィット(x_train、labels_train)
- 「feature_importances_」の場合 dir (モデル):
- model.feature_importances_ を印刷する
-
- 分類レポートを印刷する(
- ラベル_train、
- モデルを予測する(x_train)
-
- 分類レポートを印刷する(
- y_テスト、
- モデルを予測する(x_test)
- リターンモデル
-
- モデルスコア(x_train、labels_train、x_test、y_test、RandomForestClassifier、rf_params)
トレーニング セットの混同行列は次のとおりです。 テスト セットの混同行列は次のとおりです。 この時点で、テスト セットでの精度が 83% の予備学習モデルが確立されました。時間の制約により、最適化と思考のセクションは次の記事で共有される予定ですので、お楽しみに。 オリジナルリンク: https://cloud.tencent.com/community/article/229506 著者: 趙成龍 [この記事は51CTOコラムニスト「テンセントクラウドテクノロジーコミュニティ」によるオリジナル記事です。転載の許可を得るには51CTOを通じて原作者に連絡してください] この著者の他の記事を読むにはここをクリックしてください |