web-dev-qa-db-ja.com

文字列/カテゴリ機能(変数)を使用した線形回帰分析?

回帰アルゴリズムは、数字で表される機能で機能しているようです。例えば:

enter image description here

このデータセットには、カテゴリの特徴/変数は含まれていません。このデータで回帰を行い、価格を予測する方法は非常に明確です。


しかし、今、カテゴリ機能を含むデータの回帰分析を行いたいと思います。

enter image description here

5機能があります:DistrictConditionMaterialSecurityType


このデータで回帰を実行するにはどうすればよいですか?この文字列/カテゴリデータをすべて数値に手動で変換する必要がありますか?いくつかのエンコードルールを作成する必要があり、そのルールに従ってすべてのデータを数値に変換する場合。独自のエンコーディングルールを手動で作成せずに文字列データを数値に変換する簡単な方法はありますか? Pythonに使用できるライブラリがいくつかありますか? 「不正なエンコーディング」のために回帰モデルが何らかの形で不正確になるというリスクはありますか?

33
Erba Aitbayev

はい、すべてを数値に変換する必要があります。それには、これらの属性が何を表すかを考える必要があります。

通常、次の3つの可能性があります。

  1. カテゴリデータのワンホットエンコーディング
  2. 順序データの任意の数
  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

Groupby操作にカテゴリデータを使用する

過去(既知のイベント)の各カテゴリの平均を使用できます。

都市の平均価格が最後にわかっている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
62
MaxNoe

この場合、「ダミーコーディング」を使用できます。 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)
8
burhan

カテゴリー変数を使用した線形回帰では、ダミー変数トラップに注意する必要があります。ダミー変数トラップは、独立変数が多重共線的であるシナリオです-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)
5
Harvey

カテゴリ変数を独立変数として回帰を実現する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

回帰の概要

enter image description here

1
ShikharDua