๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ(Preprocessing) ๋จ๊ณ์ ๋ชจ๋ธ ํ์ต(Modeling) ๋จ๊ณ๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๋ฌถ์ด์ ์์ฐจ์ ์ผ๋ก ์คํํด์ฃผ๋ ๊ธฐ๋ฅ
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import make_pipeline # โจ ํต์ฌ!
# ๋ฐ์ดํฐ ์์ฑ
data = [[828, 920, 1234567, 1020, 1111],
[824, 910, 2345612, 1090, 1234],
[880, 900, 3456123, 1010, 1000],
[870, 990, 2312123, 1001, 1122],
[860, 980, 3223123, 1008, 1133],
[850, 970, 2432123, 1100, 1221]]
data = np.float32(data)
df = pd.DataFrame(data)
x_data = df.iloc[:, :-1].values
y_data = df.iloc[:, -1].values
# ํ์ดํ๋ผ์ธ ์์ฑ: MinMax์ค์ผ์ผ๋ง -> SGDํ๊ท๋ถ์
model_pipeline = make_pipeline(MinMaxScaler(), SGDRegressor(max_iter=500))
print(model_pipeline)
# ์ถ๋ ฅ ์์:
# Pipeline(steps=[('minmaxscaler', MinMaxScaler()),
# ('sgdregressor', SGDRegressor(max_iter=500))])
# ํ์ต (fit)
# ๋ด๋ถ์ ์ผ๋ก x_data๋ฅผ ์ค์ผ์ผ๋ง(fit_transform) ํ ๋ค ๋ชจ๋ธ์ ์ ๋ฌ
model_pipeline.fit(x_data, y_data)
# ์๋ก์ด ๋ฐ์ดํฐ (์ค์ผ์ผ๋ง ์ ๋ ์๋ณธ ๊ฐ)
new_data = [[828.0, 920.0, 1234567.0, 1020.0]]
# ์์์ ๋ณํ ํ ์์ธก ์ํ
pred = model_pipeline.predict(new_data)
print(pred)
# ๊ฒฐ๊ณผ: array([762.95549553])
# make_pipeline์ ํด๋์ค ์ด๋ฆ์ ์๋ฌธ์๋ก ์๋ ์ง์ ํจ ('sgdregressor')
model_reg = model_pipeline.named_steps['sgdregressor']
print("๊ธฐ์ธ๊ธฐ:", model_reg.coef_)
print("์ ํธ:", model_reg.intercept_)
# ์ถ๋ ฅ ์์
# ๊ธฐ์ธ๊ธฐ: [175.15834 240.64082 246.2967 280.61044]
# ์ ํธ: [643.11381433]
Pipelineํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋จ๊ณ๋ณ ์ด๋ฆ์ ๋ด๊ฐ ์ํ๋ ๋๋ก ์ง์ ํ ์ ์๋ค.
(์ด๋ฆ, ๊ฐ์ฒด) ํํ ๋ฆฌ์คํธ ํ์์ ์ฌ์ฉ. ๋์ค์ ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋(GridSearchCV)์ ํ ๋๋ ๋ณต์กํ ๋ชจ๋ธ ๊ด๋ฆฌ ์ ์ด ๋ฐฉ๋ฒ์ด ๋ ์ ํธ๋๋ค.
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
# ๋ฐ์ดํฐ ๋ก๋
df = pd.read_csv('data/pima-indians-diabetes.data.csv')
x_data = df.iloc[:, :-1].values
y_data = df.iloc[:, -1].values
# ํ์ต/ํ
์คํธ ๋ถ๋ฆฌ
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.2, random_state=42)
# ๋ฆฌ์คํธ ์์ (์ด๋ฆ, ๊ฐ์ฒด) ํํ๋ก ์ ์
model_pipe = Pipeline([
('scaler', StandardScaler()), # 1๋จ๊ณ: ํ์คํ
('regress', LogisticRegression(max_iter=500)) # 2๋จ๊ณ: ๋ก์ง์คํฑ
])
# ํ์ต
model_pipe.fit(x_train, y_train)
# ์์ธก (์๋ณธ ๋ฐ์ดํฐ ์
๋ ฅ)
print(model_pipe.predict([[6, 148, 72, 35, 0, 33.6, 0.627, 50]]))
# ๊ฒฐ๊ณผ: array([1])
# ๋ด๊ฐ ์ง์ ์ด๋ฆ('regress')์ผ๋ก ๋ด๋ถ ๋ชจ๋ธ ์ ๊ทผ
model_logi = model_pipe.named_steps['regress']
print("๊ฐ์ค์น:\n", model_logi.coef_)
print("์ ํธ:", model_logi.intercept_)
| ํน์ง | make_pipeline | Pipeline |
|---|---|---|
| ์ฌ์ฉ๋ฒ | ๊ฐ์ฒด๋ง ๋์ด โ make_pipeline(A(), B()) | (์ด๋ฆ, ๊ฐ์ฒด) ํํ์ ๋ฆฌ์คํธ โ Pipeline([('a', A()), ('b', B())]) |
| ์ด๋ฆ ์ง์ | ์๋ ์์ฑ (์๋ฌธ์ ํด๋์ค๋ช ) | ์ฌ์ฉ์ ์ง์ ๊ฐ๋ฅ (Custom Name) |
| ํ์ฉ๋ | ๋น ๋ฅด๊ณ ๊ฐ๋จํ ์คํ์ฉ | ๋ณธ๊ฒฉ์ ์ธ ํ๋ก์ ํธ ๊ฐ๋ฐ, ํ๋ผ๋ฏธํฐ ํ๋(GridSearch) ๋ฑ์ ์ ํฉ |
Pipeline์ ์ ์ฒ๋ฆฌ(Scaler)์ ๋ชจ๋ธ(Estimator)์ ์ฐ๊ฒฐํด์ฃผ๋ ๋๊ตฌ๋ค.
fit ํ ๋ฒ์ผ๋ก ์ ์ฒ๋ฆฌ์ ํ์ต์ ์๋ฃํ๊ณ , predict ์์ ์๋์ผ๋ก ์ ์ฒ๋ฆฌ๋ฅผ ์ ์ฉ. (์ค์ ๋ฐฉ์ง)
make_pipeline()์ ์ด๋ฆ์ ์๋ ์์ฑํ๊ณ , Pipeline([])์ ์ด๋ฆ์ ์ง์ ์ง์ ํ๋ค.
๋ด๋ถ ์์ฑ์ด ๊ถ๊ธํ ๋ .named_steps['์ด๋ฆ']์ผ๋ก ์ ๊ทผ