Pipeline์ ๋ชจ๋ ๋ฐ์ดํฐ์ ๋๊ฐ์ ์ ์ฒ๋ฆฌ๋ฅผ ์ ์ฉํ๋ค.
๊ทธ๋ฌ๋ ์ค์ ๋ฐ์ดํฐ์ ์๋ ์ซ์(Scaling ํ์)์ ๋ฌธ์(Encoding ํ์)๊ฐ ์์ฌ์๊ธฐ ๋๋ฌธ์ ๋ณตํฉ์ ์ธ ํ์๊ฐ ํ์.
import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import OrdinalEncoder
# ๋ฐ์ดํฐ ์ค๋น
data = {
'์์นํ_ํน์ง': [10, 20, 30, 40, 50],
'๋ฒ์ฃผํ_ํน์ง': ['A', 'B', 'A', 'C', 'B'],
'๊ทธ๋๋ก_์ ์ง': [1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)
# ๋ฌธ์ ์ํฉ: ํ์ดํ๋ผ์ธ์ ์ธ์ฝ๋๋ง ๋ฃ์
model_pipe = Pipeline([('encode', OrdinalEncoder()),
('logi', LogisticRegression())])
x_data = df.iloc[:, :-1].values
y_data = df.iloc[:, -1].values
model_pipe.fit(x_data, y_data)
# ์ธ์ฝ๋๊ฐ ํ์ตํ ๋ฒ์ฃผ ํ์ธ
enc = model_pipe.named_steps['encode']
print(enc.categories_)
# ๊ฒฐ๊ณผ:
# [array([10, 20, 30, 40, 50], dtype=object), <-- ์ซ์ํ ์ปฌ๋ผ๊น์ง ์ธ์ฝ๋ฉํด๋ฒ๋ฆผ!
# array(['A', 'B', 'C'], dtype=object)]
Pipeline์ ๋ค์ด์จ ๋ชจ๋ ๋ฐ์ดํฐ(x_data)์ ์ผ๊ด์ ์ผ๋ก ๋ณํ์ ์๋.๊ตฌ์กฐ
transformers๋ฆฌ์คํธ: (์ด๋ฆ, ๋ณํ๊ธฐ, [์ ์ฉํ ์ปฌ๋ผ]) ํํ์ ํํ์ ๋ด์.
remainder='passthrough': ์ง์ ํ์ง ์์ ๋๋จธ์ง ์ปฌ๋ผ๋ค์ ๊ฑด๋๋ฆฌ์ง ๋ง๊ณ ํต๊ณผ์ํค๋ผ๋ ์ต์ (๊ธฐ๋ณธ๊ฐ์ 'drop'์ด๋ผ ๋ค ๋ฒ๋ ค์ง๋๋ค. ์ฃผ์!)
from sklearn.compose import ColumnTransformer
# 1๋ฒ์งธ ์ด(๋ฒ์ฃผํ_ํน์ง)๋ง ์ธ์ฝ๋ฉํ๊ณ , ๋๋จธ์ง๋ ํต๊ณผ
# [1] ์ฒ๋ผ ๋ฆฌ์คํธ๋ก ๊ฐ์ธ์ผ ํจ
column_preprocessor = ColumnTransformer(
[('enc', OrdinalEncoder(), [1])],
remainder='passthrough'
)
# ํ์ดํ๋ผ์ธ ๊ฒฐํฉ
model_cpipe = Pipeline([
('ct', column_preprocessor),
('logi', LogisticRegression(max_iter=500))
])
# ์์ธก ์์๋ Array ํํ๋ก ์
๋ ฅ
model_cpipe.fit(x_data, y_data)
print(model_cpipe.predict([[10, 'A']])) # array([1])
# DataFrame์ผ๋ก ๋ถ๋ฆฌ
x_df = df.iloc[:, :-1] # DataFrame ์ ์ง
y_df = df.iloc[:, -1]
# ์ปฌ๋ผ๋ช
์ผ๋ก ์ง์ ๊ฐ๋ฅ
column_preprocessor = ColumnTransformer(
[('enc', OrdinalEncoder(), ['๋ฒ์ฃผํ_ํน์ง'])],
remainder='passthrough'
)
model_cpipe = Pipeline([
('ct', column_preprocessor),
('logi', LogisticRegression(max_iter=500))
])
model_cpipe.fit(x_df, y_df)
# ์์ธก ์ DataFrame ์์ฑํด์ ์
๋ ฅ (์ปฌ๋ผ๋ช
๋งค์นญ ํ์)
new_df = pd.DataFrame({'์์นํ_ํน์ง':[10], '๋ฒ์ฃผํ_ํน์ง':['A']})
print(model_cpipe.predict(new_df)) # array([1])
from sklearn.preprocessing import StandardScaler
# ์ ์ฒ๋ฆฌ ๋ฆฌ์คํธ ์ ์
transformers_list = [
('enc', OrdinalEncoder(), ['๋ฒ์ฃผํ_ํน์ง']), # ๋ฒ์ฃผํ -> ์ธ์ฝ๋ฉ
('scale', StandardScaler(), ['์์นํ_ํน์ง']) # ์์นํ -> ์ค์ผ์ผ๋ง
]
# ColumnTransformer ์์ฑ
ct = ColumnTransformer(transformers_list, remainder='passthrough')
SimpleImputer: ๋ฐ์ดํฐ์ ์กด์ฌํ๋ NaN์ ์ฑ์์ค.
์ ๋ต (Strategy)
mean: ํ๊ท ๊ฐ (์์นํ)median: ์ค์๊ฐ (์์นํ, ์ด์์น์ ๊ฐํจ)most_frequent: ์ต๋น๊ฐ (๋ฒ์ฃผํ/์์นํ ๋ชจ๋ ๊ฐ๋ฅ)constant: ํน์ ์์ ๊ฐ (0, 'Unknown' ๋ฑ)
from sklearn.impute import SimpleImputer
# ์ ์ฒ๋ฆฌ๊ธฐ ์์ Imputer ํฌํจ์ํค๊ธฐ ์์
# (์ฃผ์: Imputer๋ ๋ณดํต ๋จ๋
์ผ๋ก ์ฐ๊ฑฐ๋ Pipeline ๋ด๋ถ์ ํฌํจ๋จ)
# ์: NaN ์ปฌ๋ผ์ ์ค์๊ฐ์ผ๋ก ์ฑ์ฐ๊ณ , ๋ฒ์ฃผํ์ ์ธ์ฝ๋ฉ, ์์นํ์ ์ค์ผ์ผ๋ง
model_list = [
('nan', SimpleImputer(strategy='median'), ['NaN์ปฌ๋ผ']),
('enc', OrdinalEncoder(), ['๋ฒ์ฃผํ_ํน์ง']),
('scale', StandardScaler(), ['์์นํ_ํน์ง'])
]
๋ชฉํ: ๋ ์, ์ข ๋ฅ, ์ฐ๋น, ๋ง๋ ฅ, ํ ํฌ, ์ฐ๋ฃ ์ ๋ณด๋ฅผ ํตํด ๊ฐ๊ฒฉ ์์ธก
๋ฐ์ดํฐ: hyundaiCar.xlsx
import pandas as pd
from sklearn.linear_model import SGDRegressor
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# ๋ฐ์ดํฐ ๋ก๋
hDF = pd.read_excel('data/hyundaiCar.xlsx', sheet_name='train')
# ํน์ฑ(X)๊ณผ ํ๊ฒ(y) ๋ถ๋ฆฌ
# ์ข
๋ฅ, ์ฐ๋ฃ -> ๋ฒ์ฃผํ (OneHotEncoder)
# ๋
์, ์ฐ๋น, ๋ง๋ ฅ, ํ ํฌ -> ์์นํ (StandardScaler)
x_data = hDF[['๋
์', '์ข
๋ฅ', '์ฐ๋น', '๋ง๋ ฅ', 'ํ ํฌ', '์ฐ๋ฃ']]
y_data = hDF[['๊ฐ๊ฒฉ']]
# ์ ์ฒ๋ฆฌ ๊ท์น ์ ์
# 1. ๋ฒ์ฃผํ(์ข
๋ฅ, ์ฐ๋ฃ) -> ์-ํซ ์ธ์ฝ๋ฉ
# 2. ์์นํ(๋
์, ์ฐ๋น, ๋ง๋ ฅ, ํ ํฌ) -> ํ์คํ(StandardScaler)
# (๋
์์ ์ซ์๊ฐ ํด์๋ก ์ ์ฐจ์ด๋ฏ๋ก ์์นํ์ผ๋ก ์ค์ผ์ผ๋ง ์ฒ๋ฆฌํจ)
m_list = [
('enc', OneHotEncoder(), ['์ข
๋ฅ', '์ฐ๋ฃ']),
('scale', StandardScaler(), ['๋
์', '์ฐ๋น', '๋ง๋ ฅ', 'ํ ํฌ'])
]
# ๋๋จธ์ง ์ปฌ๋ผ์ด ์์ผ๋ฏ๋ก remainder๋ ์๋ตํ๊ฑฐ๋ passthrough
h_preprocessor = ColumnTransformer(m_list, remainder='passthrough')
SGDRegressor๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฒฝ์ฌํ๊ฐ๋ฒ ๊ธฐ๋ฐ ๋ชจ๋ธ์ด๋ฏ๋ก ์ค์ผ์ผ๋ง(StandardScaler)์ด ํ์# ํ์ดํ๋ผ์ธ: ์ ์ฒ๋ฆฌ -> ๋ชจ๋ธ
h_pipe = Pipeline([
('ctp', h_preprocessor),
('model', SGDRegressor(max_iter=500, verbose=1))
])
# ํ์ต (์ ์ฒ๋ฆฌ๊ฐ ๋ด๋ถ์์ ์๋์ผ๋ก ์ํ๋จ)
h_pipe.fit(x_data, y_data)
# ์
๋ ฅ ๋ฐ์ดํฐ๋ DataFrame์ผ๋ก ๋ง๋ค์ด์ผ ์ปฌ๋ผ๋ช
๋งค์นญ์ด ๋จ
new_car = pd.DataFrame({
'๋
์': [2015],
'์ข
๋ฅ': ['์ค์คํ'],
'์ฐ๋น': [12.3],
'๋ง๋ ฅ': [204],
'ํ ํฌ': [27],
'์ฐ๋ฃ': ['๊ฐ์๋ฆฐ']
})
# ์์ธก
predicted_price = h_pipe.predict(new_car)
print(f"์์ธก ๊ฐ๊ฒฉ: {predicted_price}")
# ๊ฒฐ๊ณผ ์์
# array([2788.91...]) -> ์ฝ 2,788๋ง ์ ์์ธก
ColumnTransformer: ์ปฌ๋ผ๋ณ๋ก ๋ค๋ฅธ ์ ์ฒ๋ฆฌ(์ธ์ฝ๋ฉ, ์ค์ผ์ผ๋ง)๋ฅผ ์ ์ฉํ ๋ ์ฌ์ฉํ๋ ํ์ ๋๊ตฌremainder='passthrough': ์ง์ ํ์ง ์์ ์ปฌ๋ผ์ ๋ฒ๋ฆฌ์ง ์๊ณ ์ ์งํ๋ ์ค์ํ ์ต์
SimpleImputer: ๋ฐ์ดํฐ์ ๊ฒฐ์ธก์น(NaN)๋ฅผ ํ๊ท , ์ค์๊ฐ, ์ต๋น๊ฐ ๋ฑ์ผ๋ก ์ฑ์์ค