Pandas์์ get_dummies ()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ๋ง ์ข์ง๋ง ๊ธฐ๊ณ ํ์ต์ ์ ์ฉํ๋ ค๋ฉด ๊ธฐ์ฐจ / ํ ์คํธ ํ๋ ์ ์ํฌ (๋๋ sklearn ์ฉ์ด๋ก "fit_transform"๋ฐ "transform")์์ ์ฌ์ฉํ ์ ์์ด์ผํฉ๋๋ค. ๋ ๋ง์ ์ค๋ช ์ด ํ์ํ๋ฉด ์๋ ค์ฃผ์ธ์.
๊ทธ๋์์ด ๊ธฐ๋ฅ์ Pandas์ ์ถ๊ฐํ๊ธฐ์ํ ์์๋ฆฌ์คํธ ๋ฒ๊ทธ ๋ณด๊ณ ์๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋๋ค์ด ์ด๊ฒ์ด Pandas์์ ์ ์ฉ ํ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํ๋ค๋ฉด ํ ์์ฒญ์ ๋ง๋ค ์๋ ์์ต๋๋ค (๊ทธ๋ฆฌ๊ณ ์ด ํ๋ก์ ํธ์ ๋ํ ๋์ ์ฒซ ๋ฒ์งธ ๊ธฐ์ฌ์ ๋ํด ์ฝ๊ฐ์ ์ฝ์นญ์ํ๊ณ ์ฝ๋ ๊ฒํ ๋ฅผ ํ ์ํฅ์ด ์์ต๋๋ค).
์ํ ํ๋ ์์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ด์๋ ์์ฌ ์ฝ๋ ์์ ๊ฐ ์ ์ฉ ํ ๊ฒ์ ๋๋ค.
@ chrish42 , ์๊ฐ ์ข์ ๊ฒ์ ๋๋ค.
์ฐธ๊ณ ๋ก scikit-learn์๋ ํ์ดํ ๋ผ์ธ์ ๋ง๋ OneHotEncoder ํด๋์ค๊ฐ ์์ต๋๋ค.
์ด์ ๊ฐ์ ๊ฒ์ด ์๋ํด์ผํฉ๋๊น?
import pandas as pd
from sklearn.pipeline import TransformerMixin
class DummyEncoder(TransformerMixin):
def __init__(self, columns=None):
self.columns = columns
def transform(self, X, y=None, **kwargs):
return pd.get_dummies(X, columns=self.columns)
def fit(self, X, y=None, **kwargs):
return self
๊ธฐ๋ถ
In [15]: df
Out[15]:
A B C
0 1 a a
1 2 b a
In [16]: DummyEncoder().transform(df)
Out[16]:
A B_a B_b C_a
0 1 1 0 1
1 2 0 1 1
์ปฌ๋ผ ์์์์ฃผ์ํ์ญ์์ค.
@TomAugspurger , ์ค์ ๋ก sklearn ์ฒ๋ฆฌ ํ์ดํ ๋ผ์ธ ์์ฒด์์ ํธํ์ฑ์ ์ ์๊ฒ ๊ด์ฌ์ด์๋ ๋ถ๋ถ์ด ์๋๋๋ค. ๋ด๊ฐ ์ํ๋ ๊ฒ์ get_dummes ()์ ์ํด ์ํ ๋ ๋ณํ์ ๋ฐ์ดํฐ ์ธํธ์ ์ ์ฅ ํ ๋ค์ ๋ ๋ฒ์งธ ๋ฐ์ดํฐ ์ธํธ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ ์ธํธ์ ๊ฐ์ ํ์ ์งํฉ์ด ์๋๋ผ๋ ํด๋น ๋ณํ์์๋ ๊ทธ๋๋ก ์ ์ฉ (์ ํํ ๋์ผํ ์ด ์์ฑ)ํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๊ฒ์ ์ค์ ๋ก "ํ๋ จ / ํ ์คํธ ํ๋ ์ ์ํฌ์์ ์ฌ์ฉ ๊ฐ๋ฅ"์ ์๋ฏธํฉ๋๋ค. ์ด ์ค๋ช ์ด ๋ ๋ช ํํฉ๋๊น? (๋๊ตฐ๊ฐ๊ฐ ์ฌ์ ํ ํ์ํ๋ค๊ณ ์๊ฐํ๋ ์๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.)
sklearn์ OneHotEncoder
ํด๋์ค๋ฅผ ์๊ณ ์์ง๋ง ๋ค๋ฅธ ์ ํ ์ฌํญ์ด ์์ต๋๋ค.
๋๋ @ chrish42 ์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ฐ์ฐํ ๋ฐ๊ฒฌํ๊ณ get_dummies๊ฐ ๋์๊ฒ ๋ํต์์ฃผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋ค์ df_train DataFrame์ ๋ฐ์ดํฐ๋ก ์์ ํ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
```.python
df_train = pandas.DataFrame ({ "car": [ "seat", "bmw"], "color": [ "red", "green"]})
pandas.get_dummies (df_train)
car_bmw car_seat color_green color_red
0 0 1 0 1
1 1 0 1 0
Then we are provided with
``` .python
df_test = pandas.DataFrame({"car":["seat","mercedes"], "color":["red","green"]})
pandas.get_dummies(df_test )
car_mercedes car_seat color_green color_red
0 0 1 0 1
1 1 0 1 0
df_train์์ ๋ณ์ "car"์ ๋ํ "mercedes"๊ฐ์ ๋ณธ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ํซ ์ธ์ฝ๋ฉ์ ์ป์ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
```.python
car_bmw car_seat color_green color_red
0 0 1 0 1
1 0 0 1 0
Where the column car_mercedes actually never appears.
This could be solved by allowing get_dummies to receive an input dictionary stating the accepted values that we allow for each column.
Returning to the previous example, we could give as input to get_dummies the following dict of sets
``` .python
accepted_values_per_column = {'car': {'bmw', 'seat'}, 'color': {'green', 'red'}}
get_dummies๊ฐ
```.python
get_dummies (df_test, Accepted_values_per_column = Accepted_values_per_column)
car_bmw car_seat color_green color_red
0 0 1 0 1
1 0 0 1 0
```
get_dummies (df_test)๊ฐ ์ด๋ฏธ ๋ฐํ ๋ ๊ฒ์ ๋ฐํ ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
๊ด์ฐฐ๋์ง ์์ ๋ณ์๋ฅผ _ ๊ฐ๋ฅํ๊ฒ _ ์ง์ ํ๋ ค๋ฉด ๋ณ์๋ฅผ Categorical
๋ก ์ง์ ํ๋ฉด๋ฉ๋๋ค. ์ด ์์
์ ์์ฑ์ ๋๋ ์ดํ์ ์ํ ํ ์ ์์ต๋๋ค. ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
In [5]: df_train = pd.DataFrame({"car":Series(["seat","bmw"]).astype('category',categories=['seat','bmw','mercedes']),"color":["red","green"]})
In [6]: df_train
Out[6]:
car color
0 seat red
1 bmw green
In [7]: pd.get_dummies(df_train )
Out[7]:
car_seat car_bmw car_mercedes color_green color_red
0 1 0 0 0 1
1 0 1 0 1 0
์๋ ์ง๋ฌธ์ ์ ์ง์ ๋์ด ์์ง ์์ผ๋ฏ๋ก ๋ซ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ธ์ฝ๋ฉ์์ ๋ค์ Categorical๋ก ์ด๋ํ ๋๋ Categorical.from_codes๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์น ์๋ ์กฐ์ธ์ด ํ๋ ๋ ์์ต๋๋ค. ๋ฒ์ฃผ ํ์ ๋ํ ๊ณ์์ ์ ํํ ์ถ์ ์ ๊ด์ฌ์ด ์๋ค๋ฉด ์ธ์ฝ๋ฉ ๋ ์ด ์ค ํ๋๋ฅผ ์ญ์ ํ์ง ์์ผ๋ฉด ์ ํธ๊ณผ ํจ๊ป ๋ค์ค ๊ณต์ ์ฑ์ ๊ฐ๊ฒ๋ฉ๋๋ค (์๋ ๊ฒฝ์ฐ).
2015 ๋ 10 ์ 5 ์ผ 05:34์ Jeff Reback [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๊ด์ธก๋์ง ์์ ์์๋ ๋ณ์๋ฅผ ์ง์ ํ๋ ค๋ฉด ๋ณ์๋ฅผ ๋ฒ์ฃผ ํ์ผ๋ก ๋ง๋ค๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค. ์ด ์์ ์ ์์ฑ์ ๋๋ ์ดํ์ ์ํ ํ ์ ์์ต๋๋ค. ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
[5]์์ : df_train = pd.DataFrame ({ "car": Series ([ "seat", "bmw"]). astype ( 'category', categories = [ 'seat', 'bmw', 'mercedes'] ), "color": [ "red", "green"]})
[6] : df_train
์ถ๋ ฅ [6] :
์๋์ฐจ ์์
0 ์ข์ ๋นจ๊ฐ์
1 BMW ๊ทธ๋ฆฐ[7] : pd.get_dummies (df_train)
์ถ๋ ฅ [7] :
car_seat car_bmw car_mercedes color_green color_red
0 1 0 0 0 1
101010
์๋ ์ง๋ฌธ์ ์ ์ง์ ๋์ด ์์ง ์์ผ๋ฏ๋ก ๋ซ์ต๋๋ค.โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
@TomAugspurger @jreback ์ต๊ทผ์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๊ณ ์๊ฐํ๋ฉฐ ์๋ฅผ ๋ค์ด๋ณด๊ณ ์ถ์ต๋๋ค.
train_a = pd.DataFrame ({ "IsBadBuy": [0,1,0], "์ ์กฐ์ ์ฒด": [ 'Toyota', 'Mazda', 'BMW']})
IsBadBuy Make_BMW Make_Mazda Make_Toyota
0 0 0 0 1
1 1 0 1 0
2 0 1 0 0
test_a = pd.DataFrame ({ "Make": [ 'Toyota', 'BMW']})
print pd.get_dummies (test_a, columns = [ 'Make'])
Make_BMW Make_Toyota
0 0 1
1 1 0
์ฌ๊ธฐ์ ์ด์์ ์ผ๋ก๋ ML ์๊ณ ๋ฆฌ์ฆ์ด ๋์ผํ ์์ ๊ธฐ๋ฅ์ ์์ํ๊ณ ํ ์คํธ์์ ์ป์ ๊ฐ์ด ํ์ต์์ ์ป์ ๊ฐ์ ํ์ ์งํฉ์ด ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Make_Mazda ์ด์ ๋ณด์กดํด์ผํฉ๋๋ค.
๋ฒ์ฃผ ํ์ ์ฌ์ฉํ์ญ์์ค. ์ฌ๋ฐ๋ฅธ ์์ ์ด๋ก ํ์ฅ๋ฉ๋๋ค. ๋น์ ์ด ๊ด์ฌ์ด ์๋ค๋ฉด ์ด๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค https://m.youtube.com/watch?v=KLPtEBokqQ0
_____________________________
๋ณด๋ธ ์ฌ๋ : Ajay Saxena [email protected]
๋ณด๋ธ ๋ ์ง : 2017 ๋
1 ์ 12 ์ผ ๋ชฉ์์ผ 18:31
์ ๋ชฉ : Re : [pandas-dev / pandas] ์์๋ฆฌ์คํธ : get_dummies ()๋ฅผ ํ์ต / ํ
์คํธ ํ๋ ์ ์ํฌ์ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ (# 8918)
๋ฐ๋ ์ฌ๋ : pandas-dev / pandas [email protected]
์ฐธ์กฐ : Tom Augspurger [email protected] , Mention [email protected]
@jreback ์ต๊ทผ์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๊ณ ์๊ฐ
train_a = pd.DataFrame ({ "IsBadBuy": [0,1,0], "์ ์กฐ์ ์ฒด": [ 'Toyota', 'Mazda', 'BMW']})
IsBadBuy Make_BMW Make_Mazda Make_Toyota
0 0 0 0 1
1 1 0 1 0
2 0 1 0 0
test_a = pd.DataFrame ({ "Make": [ 'Toyota', 'BMW']})
print pd.get_dummies (test_a, columns = [ 'Make'])
Make_BMW Make_Toyota
0 0 1
1 1 0
์ฌ๊ธฐ์ ์ด์์ ์ผ๋ก๋ ML ์๊ณ ๋ฆฌ์ฆ์ด ๋์ผํ ์์ ๊ธฐ๋ฅ์ ์์ํ๊ณ ํ ์คํธ์์ ์ป์ ๊ฐ์ด ํ์ต์์ ์ป์ ๊ฐ์ ํ์ ์งํฉ์ด ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ Make_Mazda ์ด์ ๋ณด์กดํด์ผํฉ๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ๋ณด๊ฑฐ๋ ์ค๋ ๋๋ฅผ ์์๊ฑฐํ์ญ์์ค.
๊ฐ์ฌํฉ๋๋ค @TomAugspurger
@TomAugspurger ๊ฐ ์ ๊ณต ํ PyData Chicago 2016 ๊ฐ์ฐ์ ์ ๋ง ํ๋ฅญํ์ต๋๋ค. ๊ทธ๋์ด ๋ฌธ์ / ์์ฒญ์ ์ข ๊ฒฐํด์๋ ์๋๋ ๋ชจ๋ ์ด์ ๋ฅผ ์ค๋ช ํ๋ ํ์์ ์ธ ์์ ์ ์ํํ์ต๋๋ค. IMHO ๊ทธ์ ํด๋์ค DummyEncoder ๋๋ ์ ์ ํ ๋๋ฑํ ์ผ๋ถ๊ฐ Pandas์ ํฌํจ๋์ด์ผํฉ๋๋ค. ์, ๊ทธ์ github๋ก ์ด๋ํ์ฌ ๊ทธ์ ํด๋์ค๋ฅผ ๋ณต์ฌ / ์๋ฎฌ๋ ์ด์ ํ ์ ์์ง๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์ ์ง์ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ข์ ๊ฒ์ ๋๋ค.
๋ฐ์ดํฐ ๋ชจ๋ธ๋ง ์ด๊ธฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
pandas ๋ฐ scikit-learn๊ณผ ์ ์๋ํฉ๋๋ค.
๊ทธ๋ฌ๋ pandas๋ scikit-learn์ ์์กดํ์ง ์์ผ๋ฉฐ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๋๋ ์๊ฐํ๋ค
๋ ๋ค ์์ ์ง์ด์ง ๋ ๋ค๋ฅธ ๋์๊ด์์ํ ๊ณต๊ฐ.
2017 ๋
5 ์ 10 ์ผ ์์์ผ ์คํ 6:13, Brian Wylie [email protected]
์ผ๋ค :
@TomAugspurger๊ฐ ์ ๊ณต ํ PyData Chicago 2016 ๊ฐ์ฐ
https://github.com/TomAugspurger ๋ ์ ๋ง ์ํ์ต๋๋ค. ๊ทธ๋
์ด ๋ฌธ์ / ์์ฒญ์ด ํ์ํ ๋ชจ๋ ์ด์ ๋ฅผ ์ค๋ช ํ๋ ํ์์ ์ธ ์์
๋ซํ์ง ๋ง์ญ์์ค. IMHO ๊ทธ์ ํด๋์ค DummyEncoder ๋๋ ํฉ๋ฆฌ์ ์ธ
์ด์ ์์ํ๋ ๋ด์ฉ์ด Pandas์ ํฌํจ๋์ด์ผํฉ๋๋ค. ๋ค github์ ๊ฐ ์ ์์ต๋๋ค
๊ทธ์ ์์ ์ ๋ณต์ฌ / ์๋ฎฌ๋ ์ด์ ํ์ง๋ง ๊ทธ๊ฒ์ ๊ฐ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ข์ ๊ฒ์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์ ์ง์๋ฉ๋๋ค.BTW ๋ด ์๊ฐ @TomAugspurger https://github.com/TomAugspurger
์๋ก์ด ์ข์ํ๋ PyData ์ ๋ฌธ๊ฐ. ๋๋ ๊ทธ๊ฐ์๋ ๋ชจ๋ ๊ฒ์ ์ฌ๋ฅ ํ ๊ฑฐ์ผ
์๋ฃ / ์์ ํ๊ณ ๊ทธ๊ฒ์ ํก์ํ๋ ค๊ณ .. ์๋ฆ ๋ผ์น๋ / ์คํ ํน ๋ฐฉ์์ผ๋ก .. ๋น์
์ ํ ์๋ฆ ๋ผ์น ์ง ์๋ ์ ์์ ์ธ ๋ฐฉ์์ผ๋ก ์๊ณ ์์ต๋๋ค. :)โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/pandas-dev/pandas/issues/8918#issuecomment-300638388 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABQHIpTqgHSE7iFVF9Pp4_YoKB9DPLcEks5r4kSrgaJpZM4DB6Hb
.
์ฌ๊ธฐ์ ๋์์ด ๋ ๋งํ ์ฐ๋ฆฌ ์ค ์ผ๋ถ๊ฐ ์์ ํ ์์ ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค. ์ ํฉ / ๋ณํ ๊ธฐ๋ฅ์ด์๋ ๋๋ฏธ ๋ณ์.
https://github.com/joeddav/get_smarties
ํผ๋๋ฐฑ๊ณผ ๊ธฐ์ฌ๊ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค!
# 14017๊ณผ ๊ด๋ จ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
์ด ๋ฌธ์ ์ ์ ํํ ๋์์ด ๋ ์์๋ ์๋ฃจ์ ์ ๋ง๋ค์์ต๋๋ค. ์ด์ฐจ ํ ์คํธ ํ๋ ์ ์ํฌ์์ ํซ ์ธ์ฝ๋ฉ ๋ฒ์ฃผ ํ ๋ณ์ ํ๋. ๋ฐ์ดํฐ ์ธํธ๊ฐ ๋๋ฌด ์ปค์ ๋จธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ง์ง ์๋ ๊ฒฝ์ฐ๋ ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๋ค.
https://github.com/yashu-seth/dummyPy
์ฌ๊ธฐ ์์ ์ด์ ๋ํ ์์ ์์ต์๋ฅผ ์ฐพ์ ์๋
์ด๊ฒ์ ๊ตฌ๋ ํ๋ ์ฌ๋๋ค์ dask-ml์ ๊ตฌํ์ ๊ด์ฌ์ด์์ ๊ฒ์ ๋๋ค.
@TomAugspurger ์ด ์ฝ๋๋ ์๋ํ์ง ์์ต๋๋ค. ํ๋ก๋์
๋จ์ผ ๋ ์ฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ค๋ฉด ํ์ฌ ์กด์ฌํ๋ ๋จ์ผ ๊ฐ์ ๋ํด ํซ ์ธ์ฝ๋ฉ ๋ ์ด ํ๋๋ง ์ ๊ณตํฉ๋๋ค.
๋ด๊ฐ ๋ฌด์์ ๋์น๊ณ ์์ต๋๊น?
์์
pyodbc
์์
ํผํด
sklearn.linear_model์์ ๊ฐ์ ธ ์ค๊ธฐ LogisticRegression
sklearn.linear_model์์ ๊ฐ์ ธ ์ค๊ธฐ LinearRegression
numpy๋ฅผ np๋ก ๊ฐ์ ธ ์ค๊ธฐ
ํฌ๋๋ฅผ pd๋ก ๊ฐ์ ธ ์ค๊ธฐ
sklearn.pipeline import TransformerMixin์์
sklearn.pipeline์์ ๊ฐ์ ธ ์ค๊ธฐ make_pipeline
ํด๋์ค DummyEncoder (TransformerMixin) :
def fit (self, X, y = None) :
self.index_ = X.index
self.columns_ = X.columns
self.cat_columns_ = X.select_dtypes (include = [ 'category']). columns
self.non_cat_columns_ = X.columns.drop (self.cat_columns_)
self.cat_map_ = {col: X[col].cat for col in self.cat_columns_}
left = len(self.non_cat_columns_)
self.cat_blocks_ = {}
for col in self.cat_columns_:
right = left + len(X[col].cat.categories)
self.cat_blocks_[col], left = slice(left, right), right
return self
def transform(self, X, y=None):
return np.asarray(pd.get_dummies(X))
def inverse_transform(self, X):
non_cat = pd.DataFrame(X[:, :len(self.non_Cat_columns_)],
columns=self.non_cat_columns_)
cats = []
for col, cat in self.cat_map_.items():
slice_ = self.cat_blocks_[col]
codes = X[:, slice_].argmax(1)
series = pd.Series(pd.Categorical.from_codes(
codes, cat.categories, ordered=cat.ordered
), name=col)
cats.append(series)
df = pd.concat([non_cat] + cats, axis=1)[self.columns_]
return df
cnxn = pyodbc.connect ( 'DRIVER = {SQL Server}; SERVER = {XXXXX}; DATABASE = {ML_Learn_Taxi}; UID = {XXXX}; PWD = {XXXX}')
SQL = "" "
SELECT top 1 CONVERT (int, [order_key]) order_key
, CONVERT (int, [service_date_key]) service_date_key
, [order_source_desc]
, 1 as 'return_flag'
FROM [ML_Return_Customer]. [dbo]. [return_customers_test_set]
WHERE [order_source_desc] = '์จ๋ผ์ธ'
๋
ธ๋ ์กฐํฉ
SELECT ์์ 2 CONVERT (int, [order_key])
, CONVERT (int, [service_date_key])
, [order_source_desc]
, 2
FROM [ML_Return_Customer]. [dbo]. [return_customers_test_set]
WHERE [order_source_desc] = '์์ ์ ํ'
๋
ธ๋ ์กฐํฉ
SELECT top 1 CONVERT (int, [order_key])
, CONVERT (int, [service_date_key])
, [order_source_desc]
,1
FROM [ML_Return_Customer]. [dbo]. [return_customers_test_set]
WHERE [order_source_desc] = '๋ฐ์ ์ ํ'
"" "
prod_sql = "" "
SELECT top 1 CONVERT (int, [order_key]) order_key
, CONVERT (int, [service_date_key]) service_date_key
, [order_source_desc]
, 1 as 'return_flag'
FROM [ML_Return_Customer]. [dbo]. [return_customers_test_set]
WHERE [order_source_desc] = '์จ๋ผ์ธ'
"" "
InputDataSet = pd.read_sql (sql, cnxn)
ProdDataSet = pd.read_sql (prod_sql, cnxn)
print ( " * * * * ๋ฐ์ดํฐ * * * * * ")
์ธ์ (InputDataSet)
print ( " * ๋ฒ์ฃผ ์ด ์ ๋ณด * * ")
์ด = [ 'order_source_desc']
InputDataSet [columns] = InputDataSet [columns] .apply (lambda x : x.astype ( 'category'))
InputDataSet.info ()
print ( " * ์ ํ ํ๊ท * * ")
X = InputDataSet.drop ( 'return_flag', ์ถ = 1)
y = InputDataSet [ 'return_flag']
A = ProdDataSet.drop ( 'return_flag', ์ถ = 1)
B = ProdDataSet [ 'return_flag']
enc = DummyEncoder ()
enc.fit (X)
Prod = enc.transform (A)
์ธ์ (Prod)
์ถ๋ ฅ : * * * * ๋ฐ์ดํฐ * * * *
order_key service_date_key order_source_desc return_flag
0 10087937 20151214 ์จ๋ผ์ธ 1
1 10088174 20151201 ์ธ๋ฐ์ด๋ ํตํ 2
2 10088553 20151217 ์์ ์ ํ 2
3663478 20160806 ์์ ๋ฐ์ด๋ ํตํ 1
* ์นดํ
๊ณ ๋ฆฌ ์ด ์ ๋ณด * *
RangeIndex : 4 ๊ฐ ํญ๋ชฉ, 0 ~ 3
๋ฐ์ดํฐ ์ด (์ด 4 ๊ฐ ์ด) :
order_key 4 null์ด ์๋ int64
service_date_key 4 null์ด ์๋ int64
order_source_desc 4 ๋์ด ์๋ ๋ฒ์ฃผ
return_flag 4 null์ด ์๋ int64
dtypes : category (1), int64 (3)
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ : 284.0 ๋ฐ์ดํธ
* ์ ํ ํ๊ท * * *
[[10087937 20151214 1]]
๊ทธ๋์ ์ ๋์ด ์ค๋ ๋๊ฐ ์ฝ๊ฐ ์ง์ ๋ถํ๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์ฌ๊ธฐ์ ๊ฐ๋จํ ํด๊ฒฐ์ฑ ๊ณผ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์ด๋ฏธ ๊ฐ๋ฅํ์ง ์์ฝํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. ํ ์ด์ ๋ํด ์ค๋ช ํ์ง๋ง ์ฌ๋ฌ ์ด๋ก ์ผ๋ฐํ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ "fit"ํธ์ถ์์ ๋ค์์ ์ํํ์ญ์์ค.
categories = sorted(training_data.iloc[:, column_index].value_counts(dropna=True).index)
ํผํ
ํ๋ ๋์ ๋ฐฐ์ฐ๋ ์ํ์ categories
์ ์ ์ฅํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ "๋ณํ"์์ ๋ค์์ ์ํํฉ๋๋ค.
from pandas.api import types as pandas_types
categorical_data = testing_data.iloc[:, [column_index]].astype(
pandas_types.CategoricalDtype(categories=categories),
)
one_hot_encoded = pandas.get_dummies(categorical_data)
๊ทธ๋ฆฌ๊ณ ๊ฐ์ ๋ํด ํญ์ ๋์ผํ ๋งคํ์์ ์-ํซ ์ธ์ฝ๋ฉ์ ์ํํฉ๋๋ค. ํ์ต ์ค์ ์ผ๋ถ ๋ฒ์ฃผ ๊ฐ์ด ์์ผ๋ฉด ํ ์คํธ ์ค์ NaN์ผ๋ก ํ์๋ฉ๋๋ค. ํ ์คํธ ์ค์ ์ผ๋ถ ๊ฐ์ด ํ์๋์ง ์์ผ๋ฉด ํด๋น ์ด์ด ์ค์ ๋์ง ์์ต๋๋ค.
์์ฃผ ์ข์ต๋๋ค. ๋๋ ์ด๊ฒ์ํ๊ณ ์ถ์ ๋ชจ๋ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์๋กญ๊ฒ ๋ฐ๊ฒฌ ํ ํ์๊ฐ ์์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ;-)
@mitar ๊ฐ ์ ์ํ ์ ๊ทผ ๋ฐฉ์์ ์ข์ ์งง์ ์์ ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ๋ ๊ธด ํ๊ตฌ๋ฅผ ์ํด ์ ์ฉํ๊ณ ๋์์ด ๋ ์์๋ ๋ ธํธ๋ถ์ด ์์ต๋๋ค : https://nbviewer.jupyter.org/github/SuperCowPowers/scp-labs/blob/master/notebooks/Categorical_Encoding_Dangers.ipynb
Kaggle XGBoost ํํ ๋ฆฌ์ผ์ ์ฐ์ต์์ ์๋ ์ฝ๋๋ฅผ ๋ณด์์ต๋๋ค. ์ด๊ฒ์ ํธ๋ฆญ์ ๋๋ค.
X_train = pd.get_dummies(X_train)
X_valid = pd.get_dummies(X_valid)
X_test = pd.get_dummies(X_test)
X_train, X_valid = X_train.align(X_valid, join='left', axis=1)
X_train, X_test = X_train.align(X_test, join='left', axis=1)
๋๋ ๋ํ ๊ฐ์ ๋ฌธ์ ์ ์ฌ๋ฌ ๋ฒ ์ง๋ฉดํ์ต๋๋ค. ๋๋ ๋๋ฅผ ์ํด ์ผ์ ๋ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์์ (์ด ํ ๋ก ์์ ์์ด๋์ด๋ฅผ ์ป์)์ ์์ฑํ์ต๋๋ค.
import pandas
from sklearn.preprocessing import LabelEncoder
class CategoryEncoder:
'''
labelEncoding : boolean -> True If the categorical columns are to be label encoded
oneHotEncoding : boolean -> True If the categorical columns are to be one hot encoded (using pandas.get_dummies method)
dropFirst : boolean -> True if first column is to be dropped (usually to avoid multi-collinearity) post one hot encoding
Doesn't matter if oneHotEncoding = False
df : pandas.DataFrame() -> dataframe object that needs to be encoded
catCols : list -> list of the categorical columns that need to be encoded
'''
def __init__(self,labelEncoding=True,oneHotEncoding=False,dropFirst=False):
self.labelEncoding = labelEncoding
self.oneHotEncoding = oneHotEncoding
self.dropFirst = dropFirst
self.labelEncoder = {}
self.oneHotEncoder = {}
def fit(self,df,catCols=[]):
df1 = df.copy()
if self.labelEncoding:
for col in catCols:
labelEncoder = LabelEncoder()
labelEncoder.fit(df1.loc[:,col].astype(str))
df1.loc[:,col] = labelEncoder.transform(df1.loc[:,col])
self.labelEncoder[col] = labelEncoder.classes_
if self.oneHotEncoding:
for col in catCols:
cats = sorted(df1.loc[:,col].value_counts(dropna=True).index)
self.oneHotEncoder[col] = cats
def transform(self,df,catCols=[]):
df1 = df.copy()
if self.labelEncoding:
for col in catCols:
labelEncoder = self.labelEncoder[col]
labelEncoder = {v:i for i,v in enumerate(labelEncoder.tolist())}
print(labelEncoder)
df1.loc[:,col] = df1.loc[:,col].map(labelEncoder)
if self.oneHotEncoding:
for col in catCols:
oneHotEncoder = self.oneHotEncoder[col]
df1.loc[:,col] = df1.loc[:,col].astype(pandas.CategoricalDtype(categories=oneHotEncoder))
df1 = pandas.get_dummies(df1,columns=catCols,drop_first=self.dropFirst)
return df1
์ธ์ฝ๋์ ์ธ์คํด์ค๋ฅผ ์์ํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
enc1 = CategoryEncoder(True,False) # Will label encode but not one-hot encode
enc2 = CategoryEncoder(False,True,True) # Will one-hot encode but not label encode
enc3 = CategoryEncoder(True,True,True) # Will label encode first and then one-hot encode
# List of categorical columns you want to encode
categorical_columns = ['col_1', 'col_2']
enc1.fit(train_df, categorical_columns)
enc1.transform(test_df, categorical_columns) # Returns the dataframe encoded columns
์ฐธ๊ณ : ์ด๊ฒ์ ๋ฐ์ดํฐ ํ๋ ์์์ ์ฌ์ฉํ ์์๋ ์ด ์ด๋ฆ ์ ๋ฌ๊ณผ ๊ฐ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ด์ฐฐ๋์ง ์์ ๋ณ์๋ฅผ _ ๊ฐ๋ฅํ๊ฒ _ ์ง์ ํ๋ ค๋ฉด ๋ณ์๋ฅผ
Categorical
๋ก ์ง์ ํ๋ฉด๋ฉ๋๋ค. ์ด ์์ ์ ์์ฑ์ ๋๋ ์ดํ์ ์ํ ํ ์ ์์ต๋๋ค. ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.์๋ ์ง๋ฌธ์ ์ ์ง์ ๋์ด ์์ง ์์ผ๋ฏ๋ก ๋ซ์ต๋๋ค.