カテゴリ変数のためのいくつかの治療法

1、簡単な紹介

カテゴリ変数を列挙することに類似していた、我々は、値型の特定の番号を持っています。

たとえば、次の要素の赤と青の色の分類、中、小分類の形状の要素。

そして、このような大きな値は、実質的に赤色データなどのように英語の文字列または指定された、この時間は、我々はいくつかの操作を実行する必要があり、彼らは値がプロセスまたは削除に直接マッピングすることができることになりました。

 

図2に示すように、三つの方法(コードの解釈とともに)

まず、レッツ・前処理

 

インポートPd等パンダ
 から sklearn.model_selectionのインポートtrain_test_split 

読み出されたデータ 
X = pd.read_csv(' ../input/train.csv '、index_col = ' イド' 
X_test = pd.read_csv(' ../input/test .CSV ' =、index_col ' イド' 

#の予測子から欠落対象、別個の標的と削除行 
[X.dropna(軸= 0、サブセット= ' SalePrice ' ]、インプレース= TRUE) 私たちの従属変数がSalePriceですので、我々はいくつかの不足しているターゲットをドロップする必要があり

、Y = X.SalePrice 従属変数を選択し 
X.drop([ SalePrice  ]、軸= 1、インプレース= TRUE) #

我々はよ、物事をシンプルに保つために欠損値付きドロップ列 
= [COL cols_with_missing ため COL  X.columns もしX [COL] .isnull()任意の()] 
X.drop(cols_with_missing、軸 = 1、インプレース= TRUE)
X_test.drop(cols_with_missing、軸 = 1、インプレース= TRUE)
は、今、私たちは欠損値なしでデータフレームを持っている

訓練データから検証セットを折り 
X_train、X_valid、y_train、y_valid = train_test_split(X、Y、
                                                      train_size = 0.8、test_size = 0.2 
                                                      random_state = 0)
コードの表示

 

 

1)カテゴリ変数を削除します。

drop_X_train = X_train.select_dtypes([=除外' オブジェクト' ])
drop_X_valid = X_valid.select_dtypes([=除外' オブジェクト' ])
除外する= [ 'オブジェクト']意味カテゴリデータ
コードの表示

その後、彼らのmean_absolute_errorの波の値を確認することができます

 

2)エンコードされたラベル

建設すなわちマッピング値。

 

 

しかし、ここでは①特に注意、我々は単純な暴力は、有効なサンプルを言うことができないので、それはコンパイルエラーとなる場合は、列車カテゴリ変数に直接ラベルの内側に行く、列車が有効な2つのサンプルとして始まった分割しましたいくつかのカテゴリ変数の上に電車の中で表示されていないが存在します。

カテゴリのみがランクされているので、②この場合、この仮定は、理にかなっています。いないすべてのカテゴリ変数は、順序で明確な価値を持っているが、我々は秩序と呼ばれるこれらの変数を持つことになります有序变量(そのような決定木とランダムフォレストなど)、ツリーベースのモデルの場合は、順序変数をコーディングラベルは良い効果かもしれません。

すべてのカテゴリ列 
object_cols = [COL ため COL  X_train.columns 場合 X_train [COL] .dtype == " オブジェクト" ] 

#の安全に符号化されたラベルできる列 
good_label_colsを= [COL ため COL  object_cols もし 
                   セット(X_train [COL] ) == (X_valid [COL])]セット
 我々はX_trainがX_validとしてエンコード同じラベル持っているデータセットを保証しなければならないことがわかり

データセットから削除されます問題のある列 
-set(good_label_cols)bad_label_cols =リスト(セット(object_cols)を)
コードの表示
sklearn.preprocessing インポートLabelEncoder 

符号化されませんドロップカテゴリ列 
label_X_train = X_train.drop(bad_label_cols、軸= 1 
label_X_valid = X_valid.drop(bad_label_cols、軸= 1 

適用ラベルエンコーダ 
label_encoder = LabelEncoder() 
 のための COLをgood_label_cols:
    label_X_train [COL] = label_encoder.fit_transform(label_X_train [COL])
    label_X_valid [COL] = label_encoder.transform(label_X_valid [COL])
コードの表示

 

3)ワンホットエンコーディング

 

 多くのカテゴリそうならば通常は比較的低いベースのため、我々はので、それは、我々は非常に大きいのリストを展開することを意味し、我々は列の数を追加しますどのように多くの種類、我々はデータの列数を追加したいことがわかります①コラム・ホットエンコーディング。次いで、カラムは、符号化されたラベルを使用することができる、高カーディナリティ削除データから濃縮することができます。通常の状況下では、10のカテゴリの選挙削除基準として

②ワンホットエンコードされたカテゴリの異なるタグコード配列が想定されていません。シーケンス内の明確な分類データ(例えば、「赤」のいずれよりも少ない「黄色」よりも「黄色」より)がない場合したがって、この方法は特に有効であり得ます。私たちは、名目変数と呼ばれるカテゴリ変数のない固有の順序を持​​っていません。

ワンホットエンコードされる列 
low_cardinality_cols = [COL ため COL  object_cols 場合 X_train [COL] .nu​​nique()<10 ] 

#のデータセットから削除される列 
high_cardinality_cols =リスト(セット(object_cols)-set(low_cardinality_cols ))
コードの表示
sklearn.preprocessing インポートOneHotEncoder 

カテゴリデータと各列にワンホットエンコーダを適用 
OH_encoder = OneHotEncoder(handle_unknown = ' 無視'、疎= 偽)
OH_cols_train = pd.DataFrame(OH_encoder.fit_transform(X_train [low_cardinality_cols]))
OH_cols_valid = pd.DataFrame(OH_encoder.transform(X_valid [low_cardinality_cols])) 

ワンホットエンコーディング除去指数; それを元に戻す 
OH_cols_train.index = X_train.index 
OH_cols_valid.index = X_valid.index 

(ワンホットエンコーディングで置き換えます)カテゴリ列を削除 
num_X_train = X_train.drop(object_cols、軸= 1 
num_X_valid = X_valid.drop(object_colsは、軸= 1 

の数値機能をワンホット符号化列を追加 
OH_X_train = PD。連結([num_X_train、OH_cols_train]、軸= 1 
OH_X_valid = pd.concat([num_X_valid、OH_cols_valid]、軸= 1)
コードの表示

 

おすすめ

転載: www.cnblogs.com/Y-Knightqin/p/12556156.html