์ ๋ ฅ ๋ณ์()๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋์ง, ํนํ ํ๋ ฌ(Matrix)์ ์ฐจ์์ ๋ง์ถ๋ ๋ฒ์ ์ค์ ์ ์ผ๋ก ํ์ธํด๋ณด์
์์:
ํ๋ ฌ์:
์ธ ๋ฒ์ ์ชฝ์ง์ํ ์ ์(q1, q2, mid)๋ฅผ ํตํด ๊ธฐ๋ง๊ณ ์ฌ ์ ์(final)๋ฅผ ์์ธกํ๊ธฐ
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
# ๋ฐ์ดํฐ ๋ก๋ (header๊ฐ ์๋ ๊ฒฝ์ฐ)
df = pd.read_csv('data-01.csv', header=None)
df.columns = ['q1', 'q2', 'mid', 'final']
df.head()

๋ ๋ฆฝ๋ณ์()๊ฐ 3๊ฐ(
q1,q2,mid)์ด๊ณ ์ข ์๋ณ์()๊ฐ 1๊ฐ(final)์ ๋๋ค.
# X: ๋ง์ง๋ง ์ด์ ์ ์ธํ ๋ชจ๋ ์ด (ํน์ฑ 3๊ฐ)
# Y: ๋ง์ง๋ง ์ด (๋ผ๋ฒจ 1๊ฐ)
x = df.iloc[:, :-1].values
y = df.iloc[:, [-1]].values
model = LinearRegression()
model.fit(x, y)
# ํ์ต๋ ๊ฐ์ค์น(w)์ ์ ํธ(b) ํ์ธ
print('๊ฐ์ค์น(Coefficients):', model.coef_)
print('์ ํธ(Intercept):', model.intercept_)
# ์ถ๋ ฅ ์์
# ๊ฐ์ค์น [[0.35593822 0.54251876 1.16744422]] -> ๋ณ์๊ฐ 3๊ฐ๋ผ w๋ 3๊ฐ
# ์ ํธ [-4.3361024]
Q. q1: 90, q2: 90, mid: 95์ ์ธ ํ์์ ๊ธฐ๋ง๊ณ ์ฌ ์ ์๋?
์์ธก ์ ์ ๋ ฅ ๋ฐ์ดํฐ์ Shape(ํํ)๋ฅผ ๋ง์ถ๋ ๊ฒ์ด ํต์ฌ
# ๋ชจ๋ธ์ด ํ์ตํ ๋ X๊ฐ (N, 3) ํํ์์ผ๋ฏ๋ก,
# ์์ธกํ ๋๋ (1, 3) ํํ๋ก ๋ฃ์ด์ค์ผ ํจ (๋๊ดํธ 2๊ฐ [[ ]])
model.predict([[90, 90, 95]])
# ๊ฒฐ๊ณผ
# array([[187.43222601]])
matmul)์ด ์ฑ๋ฆฝํ๊ธฐ ์ํด ๊ฐ ๋ฐ์ดํฐ์ ์ฐจ์์ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๊ฐ์ง๋ค.๊ฐ์ค์น(, ๊ธฐ์ธ๊ธฐ):ํํ: [์ปฌ๋ผ(ํน์ฑ)์ ๊ฐ์, ๋ผ๋ฒจ์ ๊ฐ์]
์ด๋ฒ ์์ : ํน์ฑ 3๊ฐ, ๋ผ๋ฒจ 1๊ฐ (3, 1)
ํน์ฑ ๋ฐ์ดํฐ():ํํ: [๋ฐ์ดํฐ ๊ฑด์(ํ), ์ปฌ๋ผ์ ๊ฐ์(์ด)]
๋ผ๋ฒจ ๋ฐ์ดํฐ():ํํ: [๋ฐ์ดํฐ ๊ฑด์(ํ), ๋ผ๋ฒจ์ ๊ฐ์(์ด)] (๋๋ถ๋ถ 1์ด)
์์ธก ์(): ๋ฐ๋์ [ํ, ์ปฌ๋ผ์ ๊ฐ์] ํํ๋ฅผ ๋ง์ถฐ์ผ ํจ.
๊ณ์ฐ ์๋ฆฌ:
์์ธก๊ฐ ์ค์นผ๋ผ ๋์ถ
Tip: Scikit-learn์์๋ ๋ด๋ถ์ ์ผ๋ก Transpose ๋ฑ์ ์ฒ๋ฆฌํด์ฃผ์ง๋ง, ๊ฐ๋ ์ ์ผ๋ก๋ "์ ํ๋ ฌ์ ์ด ๊ฐ์์ ๋ค ํ๋ ฌ์ ํ ๊ฐ์๊ฐ ๊ฐ์์ผ ๊ณฑ์ ์ด ๋๋ค"๋ ์์น์ ๊ผญ ๊ธฐ์ตํด์ผ ํ๋ค.
n=1)๋ ์๊ฐํ๊ฐ ์ง๊ด์ # 1. ๋ฐ์ดํฐ ์ค๋น
elecDF = pd.read_csv('data/electric.csv', index_col='Unnamed: 0')
x = elecDF.iloc[:, :-1].values # ์์ฐ๋
y = elecDF.iloc[:, [-1]].values # ์ฌ์ฉ๋
# 2. ๋ชจ๋ธ ํ์ต
model = LinearRegression()
model.fit(x, y)
print(f"Shape ํ์ธ - x:{x.shape}, y:{y.shape}")
# Shape ํ์ธ - x:(12, 1), y:(12, 1)
print(f"๊ธฐ์ธ๊ธฐ:{model.coef_}, ์ ํธ:{model.intercept_}")
# ๊ธฐ์ธ๊ธฐ:[[0.49560324]], ์ ํธ:[0.91958143]
# 3. ์์ธก (์์ฐ๋์ด 4์ 5์ผ ๋)
# 2๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๋ฏ๋ก (2, 1) ํ๋ ฌ๋ก ์
๋ ฅ
print(model.predict([[4], [5]]))
# array([[2.90199437],
# [3.39759761]])
# 4. ์๊ฐํ
plt.scatter(x, y, label='์ค์ ๊ฐ')
plt.plot(x, model.predict(x), 'r', label='์์ธก์ ') # ํ๊ท์
plt.legend()
plt.show()

Girth)์ ํค(Height)๋ฅผ ์ด์ฉํ์ฌ ๋ถํผ(Volume)๋ฅผ ์์ธกํ๋ค. (๋ณ์ 2๊ฐ ๊ฒฐ๊ณผ 1๊ฐ)# 1. ๋ฐ์ดํฐ ์ค๋น
treeDF = pd.read_csv('data/trees.csv')
# Girth, Height, Volume ์ปฌ๋ผ ์กด์ฌ
x = treeDF.iloc[:, :-1].values # Girth, Height (ํน์ฑ 2๊ฐ)
y = treeDF.iloc[:, [-1]].values # Volume (๋ผ๋ฒจ)
# 2. ๋ชจ๋ธ ํ์ต
model = LinearRegression()
model.fit(x, y)
# 3. ์์ธก
# Case: (๋๋ 11, ํค 66) ๊ณผ (๋๋ 11, ํค 75) ์ธ ๋๋ฌด์ ๋ถํผ๋?
# ์
๋ ฅ ๋ฐ์ดํฐ Shape: (2, 2)
result = model.predict([[11, 66], [11, 75]])
print(result)
# ๊ฒฐ๊ณผ
# array([[16.19268807],
# [19.24594918]])
# 4. ์๊ฐํ (Line Chart ๋น๊ต)
# ๋ค์ค ํ๊ท๋ 3์ฐจ์ ์ฐจํธ๊ฐ ํ์ํ๋ฏ๋ก,
# ์ค์ ๊ฐ(y)๊ณผ ์์ธก๊ฐ(pred)์ ๋๋ํ ๊ทธ๋ ค์ ์ถ์ธ๋ฅผ ๋น๊ตํฉ๋๋ค.
pred = model.predict(x)
plt.plot(y, 'b', label='์ค์ ๊ฐ(Volume)')
plt.plot(pred, 'r--', label='์์ธก๊ฐ(Predicted)')
plt.legend()
plt.title("Actual vs Predicted Volume")
plt.show()

ํด์: ํ๋ ์ค์ (์ค์ ๊ฐ)๊ณผ ๋นจ๊ฐ ์ ์ (์์ธก๊ฐ)์ด ๋น์ทํ๊ฒ ์์ง์ธ๋ค๋ฉด ๋ชจ๋ธ ํ์ต์ด ์ ๋ ๊ฒ
predict ๋ฉ์๋ ์ฌ์ฉ ์, ํ์ต ๋ฐ์ดํฐ์ ๋์ผํ ์ด(Column) ๊ฐ์๋ฅผ ๊ฐ์ง 2์ฐจ์ ํ๋ ฌ(Array)์ ์
๋ ฅํด์ผ ํ๋ค.