import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder
# ๋ฐ์ดํฐ ์์ฑ
data = {
'์์นํ_ํน์ง': [10, 20, 30, 40, 50], # ๊ทธ๋๋ก ์ฌ์ฉ
'๋ฒ์ฃผํ_ํน์ง': ['A', 'B', 'A', 'C', 'B'], # ์ธ์ฝ๋ฉ ํ์
'๊ทธ๋๋ก_์ ์ง': [1, 0, 1, 0, 1] # ๋ผ๋ฒจ(y)
}
df = pd.DataFrame(data)
print(df)
์์นํ_ํน์ง ๋ฒ์ฃผํ_ํน์ง ๊ทธ๋๋ก_์ ์ง
0 10 A 1
1 20 B 0
2 30 A 1
3 40 C 0
4 50 B 1
# dtype=int : ๋ณด๊ธฐ ์ข๊ฒ ์ ์๋ก ๋ณํ (๊ธฐ๋ณธ๊ฐ์ float)
encode = OrdinalEncoder(dtype=int)
# ์ฃผ์: ์
๋ ฅ์ ํญ์ 2์ฐจ์ ํ๋ ฌ์ด์ด์ผ ํจ! df[['์ปฌ๋ผ']]
# fit: A, B, C๋ฅผ ํ์ต
# transform: A->0, B->1, C->2 ๋ณํ
rst = encode.fit_transform(df[['๋ฒ์ฃผํ_ํน์ง']])
rst
# array([[0],
[1],
[0],
[2],
[1]])
df['์ธ์ฝ๋ฉ'] = rst
# ํ์ต ๋ฐ์ดํฐ ๊ตฌ์ฑ (์์นํ + ์ธ์ฝ๋ฉ๋ ๋ฒ์ฃผํ)
x_data = df[['์์นํ_ํน์ง', '์ธ์ฝ๋ฉ']].values
y_data = df['๊ทธ๋๋ก_์ ์ง'].values
# ๋ชจ๋ธ ํ์ต
model = LogisticRegression(max_iter=500)
model.fit(x_data, y_data)
print(df)
# ์์นํ_ํน์ง ๋ฒ์ฃผํ_ํน์ง ๊ทธ๋๋ก_์ ์ง ์ธ์ฝ๋ฉ
0 10 A 1 0
1 20 B 0 1
2 30 A 1 0
3 40 C 0 2
4 50 B 1 1
"์์นํ 10, ๋ฒ์ฃผํ A"์ธ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ ์ถ๋ค๋ฉด?
๋ชจ๋ธ์ 'A'๋ฅผ ๋ชจ๋ฅธ๋ค. ์ง์ ์ซ์๋ก ๋ฐ๊ฟ์ค์ผ ํ๋ค.
# 1. 'A'๊ฐ ๋ช ๋ฒ์ธ์ง ์ธ์ฝ๋์๊ฒ ๋ฌผ์ด๋ด์ ๋ณํ
# ๋ฐ์ดํฐํ๋ ์ ํํ๋ก ๋ฃ์ด์ค์ผ ์๋ฌ ์ ๋จ
rst = int(encode.transform(pd.DataFrame({'๋ฒ์ฃผํ_ํน์ง':['A']})))
print(f"A๋ ์ซ์ {rst}์
๋๋ค.")
# 2. ๋ณํ๋ ์ซ์(0)๋ฅผ ๊ฐ์ง๊ณ ์์ธก ์ํ
print(model.predict([[10, rst]]))
# array([1])
๋งค๋ฒ ์์ธกํ ๋๋ง๋ค encode.transform์ ํธ์ถํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์ ๋ฐ์
OneHotEncoder ์ฌ์ฉsparse_output=False : ๊ฒฐ๊ณผ๋ฅผ ์์ถํ์ง ์๊ณ 0๊ณผ 1์ด ๋ค ๋ณด์ด๋ ๋ฐฐ์ด(Dense)๋ก ๋ฐํoencode = OneHotEncoder(sparse_output=False)
# ๋ณํ ์ํ
result = oencode.fit_transform(df[['๋ฒ์ฃผํ_ํน์ง']])
print(result)
# ๊ฒฐ๊ณผ
# [[1. 0. 0.] -> A
# [0. 1. 0.] -> B
# [1. 0. 0.] -> A
# ...
๋ฐ์ดํฐ ํฉ์น๊ธฐ (Numpy hstack) ๊ธฐ์กด ๋ฐ์ดํฐ์ ์-ํซ ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์์ผ๋ก ๋ถ์ธ๋ค.
# df.values(๊ธฐ์กด) + result(์ํซ)
arr = np.hstack((df.values, result))
# array([[10, 'A', 1, 1, 0, 0],
[20, 'B', 0, 0, 1, 0],
[30, 'A', 1, 1, 0, 0],
[40, 'C', 0, 0, 0, 1],
[50, 'B', 1, 0, 1, 0]], dtype=object)
# ์ฌ๋ผ์ด์ฑ์ผ๋ก ํ์ํ ์ปฌ๋ผ๋ง ์ ํ (์์นํ + ์ํซ3๊ฐ)
# 0: ์์นํ, 3,4,5: ์ํซ์ธ์ฝ๋ฉ๋ ์ปฌ๋ผ๋ค
x_data = arr[:, [0, 3, 4, 5]]
y_data = arr[:, 2] # ๋ผ๋ฒจ
# dtype=int: True/False ๋์ 1/0์ผ๋ก ๋ฐํ
result = pd.get_dummies(df['๋ฒ์ฃผํ_ํน์ง'], dtype=int)
# pd.concat์ผ๋ก ์์ผ๋ก ๋ถ์ด๊ธฐ (axis=1)
cdf = pd.concat([df, result], axis=1)
print(cdf)
# ์์นํ ๋ฒ์ฃผํ ... A B C
# 0 10 A ... 1 0 0
# ...
# ํ์ต ๋ฐ์ดํฐ ์ค๋น
x_data = cdf[['์์นํ_ํน์ง', 'A', 'B', 'C']].values
y_data = cdf['๊ทธ๋๋ก_์ ์ง']
model = LogisticRegression(max_iter=500)
model.fit(x_data, y_data)
[์์น, A, B, C] ํํ์ 4๊ฐ ์
๋ ฅ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์# โ model.predict([[10, 'A']]) -> ์๋ฌ ๋ฐ์!
# โ
์ง์ [10, 1, 0, 0] ํํ๋ก ๋ง๋ค์ด์ค์ผ ํจ
# 1. ์ธ์ฝ๋๋ฅผ ํตํด 'A'์ ํด๋นํ๋ ๋ฒกํฐ ๊ตฌํ๊ธฐ ([1, 0, 0])
res = oencode.transform([['A']])[0]
# 2. ๋ฆฌ์คํธ ํฉ์น๊ธฐ
my_input = []
my_input.append(10)
my_input.extend(res) # [10, 1, 0, 0] ์์ฑ
# 3. ์์ธก
print(model.predict([my_input]))
# array([1])
์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ ๋๋ง๋ค ํ์ต ๋ ์ผ๋ ์ธ์ฝ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๊ณ ,
๋ฌธ์๋ฅผ ์ซ์๋ก ๋ณํ(transform)ํ๊ณ ,
๊ธฐ์กด ์์น ๋ฐ์ดํฐ์ ํฉ์ณ์(Merge) ๋ชจ๋ธ์ ๋ฃ์ด์ฃผ๋ ์ด ๋ชจ๋ ๊ณผ์ ์ ํ๋ฒ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
# ํ์ดํ๋ผ์ธ ์์
pipeline.fit(x_train, y_train)
# ์์ธก
# ๊ทธ๋ฅ ๋ ๊ฒ ๊ทธ๋๋ก ๋ฃ์ผ๋ฉด ์์์ ๋ณํํ๊ณ ์์ธก๊น์ง ๋!
pipeline.predict([[10, 'A']])
ํต์ฌ ์์ฝ:
ํ์ต ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ํด ์๋ ์ธ์ฝ๋ฉ์ ํด๋ณด๋ ๊ฒ์ ๊ณต๋ถ์ ํฐ ๋์์ด ๋๋ค.
ํ์ง๋ง ์ค๋ฌด๋ ์ค์ ํ๋ก์ ํธ์์๋ ์ ์ ๊ฑด๊ฐ๊ณผ ์ฝ๋ ๊ฐ๊ฒฐ์ฑ์ ์ํด Pipeline์ด๋ ColumnTransformer๋ฅผ ๊ถ์ฅ!
Label Encoding: OrdinalEncoder (ํธ๋ฆฌ ๋ชจ๋ธ์ฉ)One-Hot Encoding: OneHotEncoder ๋๋ pd.get_dummies (์ ํ/๊ฑฐ๋ฆฌ๊ธฐ๋ฐ ๋ชจ๋ธ์ฉ)np.hstack (๋ฐฐ์ด ๊ฒฐํฉ) ๋๋ pd.concat (๋ฐ์ดํฐํ๋ ์ ๊ฒฐํฉ)