回帰アルゴリズムは、数字で表される機能で機能しているようです。例えば:
このデータセットには、カテゴリの特徴/変数は含まれていません。このデータで回帰を行い、価格を予測する方法は非常に明確です。
しかし、今、カテゴリ機能を含むデータの回帰分析を行いたいと思います。
5機能があります:District
、Condition
、Material
、Security
、Type
このデータで回帰を実行するにはどうすればよいですか?この文字列/カテゴリデータをすべて数値に手動で変換する必要がありますか?いくつかのエンコードルールを作成する必要があり、そのルールに従ってすべてのデータを数値に変換する場合。独自のエンコーディングルールを手動で作成せずに文字列データを数値に変換する簡単な方法はありますか? Pythonに使用できるライブラリがいくつかありますか? 「不正なエンコーディング」のために回帰モデルが何らかの形で不正確になるというリスクはありますか?
はい、すべてを数値に変換する必要があります。それには、これらの属性が何を表すかを考える必要があります。
通常、次の3つの可能性があります。
アプリケーションの場合には持っていない情報を注入しないように注意する必要があります。
カテゴリデータがある場合は、可能な値ごとに0/1の値を持つダミー変数を作成できます。
例.
idx color
0 blue
1 green
2 green
3 red
に
idx blue green red
0 1 0 0
1 0 1 0
2 0 1 0
3 0 0 1
これはパンダで簡単に行えます:
import pandas as pd
data = pd.DataFrame({'color': ['blue', 'green', 'green', 'red']})
print(pd.get_dummies(data))
結果は次のとおりです。
color_blue color_green color_red
0 1 0 0
1 0 1 0
2 0 1 0
3 0 0 1
ソート可能なカテゴリのマッピングを作成します。e。 g。古い<改装された<新しい→0、1、2
これはパンダでも可能です:
data = pd.DataFrame({'q': ['old', 'new', 'new', 'ren']})
data['q'] = data['q'].astype('category')
data['q'] = data['q'].cat.reorder_categories(['old', 'ren', 'new'], ordered=True)
data['q'] = data['q'].cat.codes
print(data['q'])
結果:
0 0
1 2
2 2
3 1
Name: q, dtype: int8
過去(既知のイベント)の各カテゴリの平均を使用できます。
都市の平均価格が最後にわかっているDataFrameがあるとします。
prices = pd.DataFrame({
'city': ['A', 'A', 'A', 'B', 'B', 'C'],
'price': [1, 1, 1, 2, 2, 3],
})
mean_price = prices.groupby('city').mean()
data = pd.DataFrame({'city': ['A', 'B', 'C', 'A', 'B', 'A']})
print(data.merge(mean_price, on='city', how='left'))
結果:
city price
0 A 1
1 B 2
2 C 3
3 A 1
4 B 2
5 A 1
この場合、「ダミーコーディング」を使用できます。 Pythonダミーコーディングを行うライブラリがあります。いくつかのオプションがあります。
Scikit-learnライブラリを使用できます。 こちら をご覧ください。
または、パンダで作業する場合は、ダミー変数を作成するための組み込み関数があります。 this を確認してください。
pandasの例は以下のとおりです。
import pandas as pd
sample_data = [[1,2,'a'],[3,4,'b'],[5,6,'c'],[7,8,'b']]
df = pd.DataFrame(sample_data, columns=['numeric1','numeric2','categorical'])
dummies = pd.get_dummies(df.categorical)
df.join(dummies)
カテゴリー変数を使用した線形回帰では、ダミー変数トラップに注意する必要があります。ダミー変数トラップは、独立変数が多重共線的であるシナリオです-2つ以上の変数が高度に相関しているシナリオ。簡単に言えば、1つの変数を他の変数から予測できます。これにより、モデルの特異性が生じる可能性があります。つまり、モデルが機能しなくなるだけです。 ここでそれについて読む
アイデアは、drop_first=True
でダミー変数のエンコードを使用することです。これにより、カテゴリ変数をダミー/インジケータ変数に変換した後、各カテゴリから1つの列が省略されます。 WILL NOTは、データセットのすべてのポイントを残りの機能で完全に説明できるため、それを行うことで関連情報を失います。
ここにあなたの住宅データセットのためにそれを行う方法の完全なコードがあります
したがって、カテゴリ機能があります。
District, Condition, Material, Security, Type
そして、あなたが予測しようとしている1つの数値的特徴:
Price
最初に、入力変数と予測で初期データセットを分割する必要があります。pandasデータフレームは次のようになります。
入力変数:
X = housing[['District','Condition','Material','Security','Type']]
予測:
Y = housing['Price']
カテゴリ変数をダミー/インジケータ変数に変換し、各カテゴリに1つドロップします。
X = pd.get_dummies(data=X, drop_first=True)
したがって、drop_first=True
でXの形状をチェックすると、4つの列が少ないことがわかります(カテゴリ変数ごとに1つ)。
これで、線形モデルで引き続き使用できます。 scikit-learn実装の場合、次のようになります。
from sklearn import linear_model
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = .20, random_state = 40)
regr = linear_model.LinearRegression() # Do not use fit_intercept = False if you have removed 1 column after dummy encoding
regr.fit(X_train, Y_train)
predicted = regr.predict(X_test)
カテゴリ変数を独立変数として回帰を実現する1つの方法は、前述のとおりです-エンコードの使用。別の方法は、statmodelsライブラリを使用した統計式のようなRを使用することです。これがコードスニペットです
from statsmodels.formula.api import ols
tips = sns.load_dataset("tips")
model = ols('tip ~ total_bill + C(sex) + C(day) + C(day) + size', data=tips)
fitted_model = model.fit()
fitted_model.summary()
データセット
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
回帰の概要