sklearn 機械学習の使い方を 5 分で解説します (パート 1)

sklearn 機械学習の使い方を 5 分で解説します (パート 1)

[[205998]]

皆さんのお役に立てれば幸いですので、この投稿を書くのは大変でした。機械学習とデータマイニングの業界背景については紹介しませんし、ロジスティック回帰、SVM、GBDT、ニューラルネットワークなどの学習アルゴリズムの理論的根拠や数学的導出についても具体的に紹介しません。この記事は、機械学習とデータモデリングを手順的にすぐに始められるように支援することに重点を置いています。

この記事は主に 4 つの部分に分かれています (時間の制約により 2 つの部分に分けられます)。

前の:

  1. 準備の部分では、主に環境構築とパンダの基礎知識が必要になります。
  2. アプリケーションのセクションでは、Kaggle の Titanic を例に、データ ソースの取得、データのクリーニング、機能の処理、モデルの選択、モデルの出力、アプリケーションについて説明します。

次:

  1. 最適化の章では、いくつかの最適化手法を紹介します。
  2. この記事では、私が気になっているいくつかの疑問を提起し、皆さんの助けを得たいと思っています。

準備

1環境構築

sklearn の実験環境全体は、python 2.7 + pycharm + Anaconda です。

2 パンダの基礎

ここでは、これから使用するパンダの知識のみを紹介します。ご興味があれば、詳しく学んでみてください。参考書として「Python for Data Analysis」をお勧めします。基本的な理解がある方は、直接アプリケーションセクションに進んでください。

Pandas は主に Series と DataFrame という 2 つのデータ構造を使用します。 Series は 1 次元配列に似ていますが、DataFrame は 2 次元のテーブル構造に似ています。

シリーズ構成法:

  1. ラベル=[1,0,1,0,1]
  2. data = pd.Series(data=label、 index =[ 'a' 'b' 'c' 'd' 'e' ]、dtype= int name = "label" )
  3. 印刷データ

シリーズはインデックスによってデータを取得します

  1. データ[ 'a' ]  
  2. データ[[ 'a' , 'b' ]]

データフレームの構築

(1)辞書形式で構築

  1. frame = pd.DataFrame({ 'name' :[ 'Time' , 'Jack' , 'Lily' ], 'Age' :[20,30,12], "weight" :[56.7,64.0,50.0]})

(2) DataFrameからDataFrameを構築する

  1. frame1 = pd.DataFrame(frame,columns=[ "名前" , "年齢" ])

フレームから 2 つの列が読み取られ、新しい DataFrame が形成されます。

データフレーム操作

1 列を追加する

  1. フレーム1[ "friends_num" ]=[10,12,14]

2. 列を削除する

  1. frame2 = frame1.drop ([ "名前" , "年齢" ],axis=1 )

3 データ行を見つける

  1. フレーム1[フレーム1[ "friends_num" ]>10]

結果は次のとおりです。

DataFrame の統計手法

1 フレーム 1 の Age 列をセグメント化するなど、列を処理するために lambda を適用します。

  1. frame1[ "Age_group" ] = frame1[ "Age" ].apply(lambda x: x < 20 の場合は 0、それ以外の場合は1)

2 出力統計情報の説明、非常に強力

  1. フレーム1.記述()

データ処理に特に役立つ 8 つの統計が提供されます。問題があります。describe メソッドを直接使用すると、数値型の列しかカウントできず、文字変数はカウントできません。パラメータを追加するだけです。

  1. frame1.describe(include=[ 'O' ])

3. 欠損値の取り扱い

  1. #欠損値を0で埋める
  2. フレーム1.フィルナ(0)
  3. #NANを含む行を破棄する
  4. フレーム1.dropna()
  5. # すべてのnan行を削除
  6. frame1.dropna(how= "すべて" )

応用

1 データの読み取り

この例では、データ ソースとして Titanic を使用します。添付ファイルでデータを入手できます。

  1. データ = pd.DataFrame(pd.read_csv(train_path))
  2. data_test = pd.DataFrame(pd.read_csv(test_path))
  3. data_test = data_test[[ "Pclass" , "名前" , "性別" , "年齢" , "同胞" , "座席" , "チケット" , "運賃" , "客室" , "搭乗" ]]
  4. x = data[[ "Pclass" , "Name" , "Sex" , "Age" , "SibSp" , "Parch" , "Ticket" , "Fare" , "Cabin" , "Embarked" ]]
  5. y = data[[ "生き残った" ]]
  6. x.describe() を印刷する
  7. x.describe(include=[ 'O' ])を印刷します。
  8. data_test.describe() を印刷する
  9. data_test.describe(include=[ 'O' ])を印刷します。

データの初期統計:

2 データクリーニング

1. 欠損値の処理。

Age 列と Embarked 列には欠損値がいくつかありますが、これらは別々に処理されます。

  1. #欠損値をモードで埋める
  2. data_set[ "乗船" ]=data_set[ "乗船" ].fillna( 'S' )
  3. #年齢の欠損値を平均値で埋める
  4. data_set[ "年齢" ]=data_set[ "年齢" ].fillna(data_set[ "年齢" ].mean())

2. 欠損率の高い列を削除する(初期処理時)

Cabin列の欠落率が75%に達したため、列を削除します。

  1. data_set = data_set.drop ([ "キャビン" ], axis=1 )

3 特徴処理

特徴処理は特定のデータに基づいて行われるため、特徴処理の前にデータを完全に理解しておく必要があります。特徴処理には決まった方法はありません。主に個人の経験と観察に依存しており、継続的な試行錯誤を通じて、より良い特徴変数を発見したいと考えています。したがって、特徴処理はモデル構築プロセスの中で最も時間がかかり、精神的に疲れるタスクです。

1) 単変量特徴抽出。

  1. #名前の長さに基づいて、name_len機能を抽象化します
  2. data_set[ "name_len" ] = data_set[ "Name" ].apply(len)

名前の列を観察する

名前列のデータを観察すると、名前に性別や婚姻状況を含むタイトル情報が見つかります。この情報を抽出します(便利な機能になる可能性があります)。

  1. data_set[ "name_class" ] = data_set[ "Name" ].apply(lambda x : x.split( "," )[1]).apply(lambda x :x.split()[0])

2) 複数の変数の組み合わせ

兄弟姉妹と配偶者の数を表す

パーチは親と子の数を表す

したがって、sibsp と parch を組み合わせると、家族のメンバーの数を取得できます。

  1. データセット[ "family_num" ] = データセット[ "Parch" ] + データセット[ "SibSp" ] +1

3) 名目変数を数値変数に変換する

  1. #乗り出した
  2. data_set[ "Embarked" ]=data_set[ "Embarked" ].map({ 'S' :1, 'C' :2, 'Q' :3}).astype( int )
  3. #セックス
  4. data_set[ "性別" ] = data_set[ "性別" ].apply(lambda x : 0 if x == '男性'  それ以外の場合1)

4) データのセグメンテーション

統計と経験に基づくセグメンテーション

  1. #[7.91,14.45,31.0] 運賃統計に基づくセグメンテーション
  2. data_set[ "運賃" ] = data_set[ "運賃" ].apply(lambda x:cutFeature([7.91,14.45,31.0],x))
  3. #[18,48,64] 経験に基づくセグメンテーション
  4. data_set[ "年齢" ] = data_set[ "年齢" ].apply(lambda x:cutFeature([18,48,64],x))

簡単なデータ処理の後、次の 12 次元データが得られます。

4 モデルの選択とテスト

最初に 5 つのモデルがテスト用に選択されました。

ランダムフォレスト分類子

エクストラツリー分類子

アダブースト分類器

勾配ブースティング分類器

SVC

モデルパラメータ:

  1. # ランダムフォレスト
  2. rf_params = {
  3. 'n_jobs' : -1,
  4. 'n_estimators' : 500,
  5. 'warm_start' : True
  6. # '最大機能' : 0.2,
  7. '最大深度' :6,
  8. '最小サンプル数' : 2,
  9. '最大特徴' : '平方根' ,
  10. '詳細' : 0
  11. }
  12. # 追加ツリー ランダムフォレスト
  13. et_params = {
  14. 'n_jobs' : -1,
  15. 'n_estimators' : 500,
  16. # '最大機能' : 0.5,
  17. '最大深度' : 8,
  18. '最小サンプル数' : 2,
  19. '詳細' : 0
  20. }
  21.  
  22. # アダブースト
  23. ada_params = {
  24. 'n_estimators' : 500,
  25. 学習率: 0.75
  26. }
  27.  
  28. #GBDT
  29. gb_params = {
  30. 'n_estimators' : 500,
  31. # '最大機能' : 0.2,
  32. '最大深度' : 5,
  33. '最小サンプル数' : 2,
  34. '詳細' : 0
  35. }
  36.  
  37. # エスビーシー
  38. svc_params = {
  39. 「カーネル」 : 「線形」
  40. 'C' : 0.025
  41. }

モデル選択コード:

  1. 分類子 = [
  2. ( "rf_model" 、 RandomForestClassifier(**rf_params))、
  3. ( "et_model" 、ExtraTreesClassifier(**et_params))、
  4. ( "ada_model" 、AdaBoostClassifier(**ada_params))、
  5. ( "gb_model" 、 GradientBoostingClassifier(**gb_params))、
  6. ( "svc_model" 、SVC(**svc_params))、
  7. ]
  8.  
  9. ホールドアウト = [0.95, 0.90, 0.75, 0.50, 0.01]
  10. ラウンド = 20
  11. xx = 1. - np.array(heldout)
  12. のために 分類子name 、 clf :
  13. print( "トレーニング %s" % name )
  14. rng = np.random.RandomState(42)
  15. yy = []
  16. heldoutiの場合:
  17. yy_ = []
  18. r範囲(ラウンド)内である場合:
  19. X_train_turn、X_test_turn、y_train_turn、y_test_turn = \
  20. train_test_split(x_train、labels_train、テストサイズ=i、ランダム状態=rng)
  21. clf.fit(X_train_turn、y_train_turn) を使います。
  22. y_pred = clf.predict(X_test_turn)
  23. yy_.append(1 - np.mean(y_pred == y_test_turn))
  24. yy.append(np.mean(yy_))
  25. plt.plot(xx, yy, ラベル=名前)
  26.  
  27. plt.legend(loc= "右上" )
  28. plt.xlabel( "比例列車" )
  29. plt.ylabel( "テストエラー率" )
  30. plt.show()

選考結果は以下の通りです。

上の図からわかるように、randomForest は一般に他のアルゴリズムよりもパフォーマンスが優れています。最初はランダムフォレスト アルゴリズムが選択されます。

トレーニング セットにおけるモデルのパフォーマンス:

  1. モデルスコアを定義します(x_train、labels_train、x_test、y_test、モデル名、et_params):
  2. print( "--------%s-------------" )%(モデル名)
  3. モデル = モデル名(**et_params)
  4.  
  5. モデルをフィット(x_train、labels_train)
  6. 「feature_importances_」の場合  dir (モデル):
  7. model.feature_importances_ を印刷する
  8.  
  9. 分類レポートを印刷する(
  10. ラベル_train、
  11. モデルを予測する(x_train)
  12.  
  13. 分類レポートを印刷する(
  14. y_テスト、
  15. モデルを予測する(x_test)
  16. リターンモデル
  17.  
  18. モデルスコア(x_train、labels_train、x_test、y_test、RandomForestClassifier、rf_params)

トレーニング セットの混同行列は次のとおりです。

テスト セットの混同行列は次のとおりです。

この時点で、テスト セットでの精度が 83% の予備学習モデルが確立されました。時間の制約により、最適化と思考のセクションは次の記事で共有される予定ですので、お楽しみに。

オリジナルリンク: https://cloud.tencent.com/community/article/229506

著者: 趙成龍

[この記事は51CTOコラムニスト「テンセントクラウドテクノロジーコミュニティ」によるオリジナル記事です。転載の許可を得るには51CTOを通じて原作者に連絡してください]

この著者の他の記事を読むにはここをクリックしてください

<<:  ビッグデータに圧倒された米国の諜報機関は人工知能に期待をかけている

>>:  アリババのナレッジグラフが完全公開、最先端の人工知能技術が雲奇カンファレンスで輝く

ブログ    

推薦する

人工知能は親密な関係の「大きな殺し屋」

人工知能の存在は仕事や生活だけではなく、感情にも存在します。仕事の後で退屈を感じたら、たまごっちを飼...

ロボットはサービス業界に参入できるのか?事実が教えてくれる

有名なアニメーション会社ディズニーは、近々人工知能とロボット工学の分野に参入すると発表しました。ディ...

...

人工知能の世界的競争が激化する中、主導権を握るのは中国か米国か?

世界的な技術競争において、人工知能は他の追随を許さない世界的な技術革新の新たな局面において、人工知能...

プログラマーがマスターになるためのプログラミングアルゴリズムトップ10

アルゴリズム1: クイックソートアルゴリズムクイックソートは、Tony Hall によって開発された...

過去20年間、Huilianは政府サービスにおけるグローバルインテリジェンスを実現してきました。

農業、工業、情報、知能、社会は常に進歩しています。長い発展の過程で、生産手段と生産ツールは常に変化し...

顔をスキャンして食べて、拭いてから帰る、アリババの未来の人工知能レストランがお披露目!

[[218392]]毎年、最も注目を集めるのはジャック・マー氏だ。彼は住宅賃貸の保証金を免除したり...

人工知能は前例のないキャリア革命をもたらすだろう

最近、サンフランシスコでEatsaというアメリカンレストランが人気になっています! [[203610...

企業が大型モデルに「参入」する場合、なぜ大手メーカーによる生産が推奨されるのでしょうか?

GPT-3.5が海外で発売されてからまだ1年も経っていないし、文心易言が国内で発売されてからまだ半...

...

5分でPythonのランダムヒルクライミングアルゴリズムをマスターする

ランダム化ヒルクライミングは最適化アルゴリズムです。検索プロセスの一部としてランダム性を使用します。...

垂直型AIスタートアップと水平型AIスタートアップ: 異なる製品ルートの選択

AIスタートアップは主に2つのスタイルに分けられます。本日の記事では、その両方を分析して見ていきます...

AIビッグモデルは今後も拡大し続けるのか?

人工知能は現在、ビジネスと金融のあらゆる側面に急速に導入されています。いくつかの刺激的な成功により、...

科学者らが病気の早期発見と治療のための埋め込み型人工知能システムを開発

海外メディアの報道によると、人工知能(AI)は医療とヘルスケアを根本的に変えるだろう。心電図、脳波、...

このトレンドは止められない!すべてのデータ サイエンティストが知っておくべき 5 つのグラフ アルゴリズム

すべてがつながっている世界では、ユーザーは独立した個人ではなく、何らかの形で互いにつながっています。...