ํ์ด์ฌ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋จธ์ ๋ฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๋ค์ํ ๋ถ๋ฅ, ํ๊ท, ๊ตฐ์ง ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณตํ๋ฉฐ, ๋ฌธ์ํ๊ฐ ๋งค์ฐ ์ ๋์ด ์์ด ์ ๋ฌธ์๊ฐ ํ์ตํ๊ธฐ ์ข์
pip install scikit-learn
์ฌ์ดํท๋ฐ์ ๋ฐ์ดํฐ์ ํํ(์ ๋ต ์ ๋ฌด)์ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ํ๋ค.

| ๋ชจ๋ | ์ค๋ช |
|---|---|
datasets | ์ฐ์ต์ฉ ๋ด์ฅ ์์ ๋ฐ์ดํฐ ์ธํธ (Iris, Boston ๋ฑ) |
preprocessing | ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ (์ ๊ทํ, ์ค์ผ์ผ๋ง, ์ธ์ฝ๋ฉ ๋ฑ) |
feature_selection | ์๋ฏธ ์๋ ํน์ง(Feature)๋ง ์ ํํ๋ ๊ธฐ๋ฅ |
feature_extraction | Feature ์ถ์ถ |
decomposition | ์ฐจ์ ์ถ์ (PCA ๋ฑ) |
model_selection | ํ์ต/ํ ์คํธ ๋ฐ์ดํฐ ๋ถ๋ฆฌ(train_test_split), ๊ต์ฐจ ๊ฒ์ฆ, ๊ทธ๋ฆฌ๋ ์์น ๋ฑ |
metrics | ๋ชจ๋ธ ์ฑ๋ฅ ํ๊ฐ (Accuracy, RMSE, ROC-AUC ๋ฑ) |
pipeline | ์ ์ฒ๋ฆฌ + ๋ชจ๋ธ๋ง ๋ฌถ์ด์ ์คํ |
linear_model | ์ ํ ํ๊ท, ๋ก์ง์คํฑ ํ๊ท, SGD ๋ฑ ์๊ณ ๋ฆฌ์ฆ |
svm | SVM |
neighbors | KNN |
naive_bayes | NB ๋ชจ๋ธ |
tree | ์์ฌ๊ฒฐ์ ๋๋ฌด ์๊ณ ๋ฆฌ์ฆ |
ensemble | ์์๋ธ ์๊ณ ๋ฆฌ์ฆ (Random Forest ๋ฑ) |
cluster | ๋น์ง๋ ๊ตฐ์ง ์๊ณ ๋ฆฌ์ฆ (K-Means ๋ฑ) |
์์ : ์๋์ฐจ์ ์๋(speed)์ ๋ฐ๋ฅธ ์ ๋ ๊ฑฐ๋ฆฌ(dist)๋ฅผ ์์ธกํ๋ ๋ชจ๋ธ์ ๋ง๋ค์ด๋ณด์
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# ํ๊ธ ํฐํฐ ์ค์ (Windows ๊ธฐ์ค)
matplotlib.rcParams['font.family']='Malgun Gothic'
matplotlib.rcParams['axes.unicode_minus'] = False
# ์ ํ ํ๊ท ๋ชจ๋ธ ์ํฌํธ
# SGDRegressor๋ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ฌ์ฉํ๋ ๋ชจ๋ธ, ์ด๋ฒ์ ์ผ๋ฐ LinearRegression ์ฌ์ฉ
from sklearn.linear_model import LinearRegression, SGDRegressor
# ๋ฐ์ดํฐ ๋ก๋
carDF = pd.read_csv('cars.csv', index_col='Unnamed: 0')
carDF

Scikit-learn์ ๋ชจ๋ธ๋ค์ ์ ๋ ฅ ๋ฐ์ดํฐ()๋ก 2์ฐจ์ ๋ฐฐ์ด(ํ๋ ฌ)์ ๊ธฐ๋
๋ฐ๋ผ์ Series๋ 1์ฐจ์ ๋ฆฌ์คํธ๋ฅผ DataFrame ํํ([[ ]]) ํน์.reshape(-1, 1)์ ํตํด ๋ณํํด์ฃผ์ด์ผ ํ๋ค.
fit(x, y)๋ ๋ฐ๋์ ํ๋ ฌ(2D) ํํ ํ์
# ํน์ฑ ๋ฐ์ดํฐ(X)์ ๋ผ๋ฒจ(y) ๋ถ๋ฆฌ
# .values๋ฅผ ์ฌ์ฉํ์ฌ numpy array๋ก ๋ณํํ๊ณ ,
# ๋๊ดํธ๋ฅผ ๋ ๋ฒ[[ ]] ์จ์ 2์ฐจ์ ๊ตฌ์กฐ ์ ์ง
x = carDF[['speed']].values # (n_samples, n_features) ํํ
y = carDF[['dist']].values # (n_samples, n_targets) ํํ
print(x.shape) # ๊ฒฐ๊ณผ ์: (50, 1) -> 2์ฐจ์ ํ์ธ ํ์!
fit(x, y)๋ฉ์๋๋ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋ชจ๋ธ(์ง์ ์ ๋ฐฉ์ ์)์ ๊ธฐ์ธ๊ธฐ()์ ์ ํธ()์ ํ์ต
model = LinearRegression()
model.fit(x, y) # ํ์ต ์์

ํ์ต๋ ๋ชจ๋ธ์ด ์ฐพ์ ์ต์ ์ ์ง์ ์:
print('๊ธฐ์ธ๊ธฐ:', model.coef_)
print('์ ํธ:', model.intercept_)
# ๊ฒฐ๊ณผ
๊ธฐ์ธ๊ธฐ [[3.93240876]]
์ ํธ [-17.57909489]
์ฆ, ์ด ๋ชจ๋ธ์ dist = 3.93 * speed - 17.57 ์ด๋ผ๋ ๊ณต์์ ๋์ถํ๋ค.
์๋ก์ด ๋ฐ์ดํฐ์ ๋ํด ๊ฒฐ๊ณผ๋ฅผ ์์ธกํด๋ณด๊ธฐ.
ํ์ต ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ ฅ๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด์ด์ด์ผ ํ๋ค.
# Case 1: ์์์ผ๋ก ์ง์ ๊ณ์ฐ (๋น๊ถ์ฅ)
# ๊ฒฐ๊ณผ๋ ๋์ค์ง๋ง, ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ข์
val = 10 * float(model.coef_) + float(model.intercept_)
print(val) # 21.74...
# Case 2: predict ๋ฉ์๋ ์ฌ์ฉ (๊ถ์ฅ) ๐
# 2์ฐจ์ ๋ฐฐ์ด๋ก ์
๋ ฅํด์ผ ํจ์ ์ฃผ์! [[10]]
print(model.predict([[10]]))
# array([[21.7449927]])
# ์ฌ๋ฌ ๊ฐ์ ๊ฐ ๋์ ์์ธก
print(model.predict([[10], [15]]))
# array([[21.7449927],
# [41.4070365]])
# 1. ์ค์ ๋ฐ์ดํฐ (์ฐ์ ๋)
plt.scatter(x, y, label='์ค์ ๊ฐ')
# 2. ์์ธก ๋ฐ์ดํฐ (์ ๊ทธ๋ํ)
# ์์ธก์ ๊ทธ๋ฆฌ๊ธฐ ์ํด x์ ์ต์~์ต๋ ๋ฒ์ ์์ฑ
pred = model.predict(x)
plt.plot(x, pred, 'r--', label='์์ธก์ ')
plt.show()
[์ด๋ฏธ์ง ์ฝ์
]
ํ๋ ฌ ๊ณฑ(Matrix Multiplication)์ ์๋ฆฌ
์ปดํจํฐ๋ ๋ฃจํ(Loop)๋ฅผ ๋๋ฉฐ ํ๋์ฉ ๊ณ์ฐํ๋ ๊ฒ๋ณด๋ค, ํ๋ ฌ ์ฐ์ฐ์ ํตํด ํ ๋ฒ์ ๊ณ์ฐํ๋ ๊ฒ์ด ํจ์ฌ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์ ํ ํ๊ท์ ์์ธก ๊ณต์์ ์ด๋ค.
๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ฉด ์ด๋ฅผ ํ๋ ฌ์ ๋ก ํํํ์ฌ ์ฒ๋ฆฌํ๋ค. ์ด๋ ํ๋ ฌ ๊ณฑ์ด ์ฑ๋ฆฝํ๋ ค๋ฉด ์ ํ๋ ฌ์ ์ด ๊ฐ์์ ๋ค ํ๋ ฌ์ ํ ๊ฐ์๊ฐ ๊ฐ์์ผ ํ๋ค(์ฃผ์!)
import numpy as np
# A ํ๋ ฌ (2 x 2)
a = np.array([[1, 2], [3, 4]])
# B ํ๋ ฌ (2 x 3)
b = np.array([[1, 2, 3], [3, 4, 5]])
# ํ๋ ฌ ๊ณฑ ์ฐ์ฐ
# ๋ฐฉ๋ฒ 1: np.matmul
print(np.matmul(a, b))
# ๋ฐฉ๋ฒ 2: @ ์ฐ์ฐ์ (ํ์ด์ฌ ์ถ์ฒ)
print(a @ b)
# ๊ฒฐ๊ณผ (2 x 3 ํ๋ ฌ์ด ๋์ด)
# array([[ 7, 10, 13],
# [15, 22, 29]])
์ฐ๋ฆฌ๊ฐ model.predict(X)๋ฅผ ํธ์ถํ ๋, ๋ด๋ถ์ ์ผ๋ก๋ ์์ ๊ฐ์ ํ๋ ฌ ๊ณฑ ์ฐ์ฐ์ด ์ผ์ด๋๋ฉฐ ์๋ง ๊ฐ์ ๋ฐ์ดํฐ๋ ์์๊ฐ์ ์์ธก๊ฐ์ ๋ด๋์ ์ ์๊ฒ๋๋ค.
LinearRegression์ ์ฌ์ฉfit โ weight/coef ํ์ต(coef = ๊ธฐ์ธ๊ธฐ, intercept = y์ ํธ)fit)๊ณผ ์์ธก(predict) ์ ๋ฐ์ดํฐ๋ ๋ฐ๋์ 2์ฐจ์ ํ๋ ฌ(Array) ํํ์ฌ์ผ ํ๋ค.