7 Mon
ํ์
์ค๋ฌด์์๊ฒ ๋ฐฐ์ฐ๋ Kaggle ๋จธ์ ๋ฌ๋ ์
๋ฌธ
K-Fold Cross Validation
๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ๋๋ฌด ์์ ๊ฒฝ์ฐ ํธ๋ ์ด๋ ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ์ ๋ถ๋ฅ ๋ฐฉ์์ ๋ฐ๋ผ ์ฑ๋ฅ ์ธก์ ๊ฒฐ๊ณผ๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์๋ค.
ํธ๋ ์ด๋ ๋ฐ์ดํฐ์ ๊ทน๋จ์ ์ธ ๋ถํฌ์ ๋ฐ์ดํฐ๊ฐ ๋ชฐ๋ ค ์๋ค๋ฉด ํ ์คํธ ๋ฐ์ดํฐ์ ์ฑ๋ฅ์ด ์ ์๋์ค๊ฒ ๋๋ค.
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html
>>> import numpy as np
>>> from sklearn.model_selection import KFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([1, 2, 3, 4])
>>> kf = KFold(n_splits=2)
>>> kf.get_n_splits(X)
2
>>> print(kf)
KFold(n_splits=2, random_state=None, shuffle=False)
>>> for train_index, test_index in kf.split(X):
... print("TRAIN:", train_index, "TEST:", test_index)
... X_train, X_test = X[train_index], X[test_index]
... y_train, y_test = y[train_index], y[test_index]
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1] TEST: [2 3]
Feature Engineering - Feature Selection
๋๋ฉ์ธ ์ง์์ด๋ ๋ถ์์ ํตํด ์ ์๋ฏธํ ํน์ง๋ค๋ง์ ์ ๋ณํด๋ด๊ฑฐ๋ Feature์ ํํ๋ฅผ ๋์ฑ ์ ํฉํ ํํ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ
์ ์ ํ Feature Enginerring์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ผ์น ์ ์๋ค
๋ค์๊ณผ ๊ฐ์ด 3์ข ๋ฅ๋ก ๋๋๋ค
Feature Selection
Normalization
Feature Generation
Feature Selection
์์ธก๊ฐ๊ณผ ์ฐ๊ด์ด ์๋ ๋ถํ์ํ ํน์ง์ ์ ๊ฑฐํด์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋์ฑ ๋์ด๋ ๊ธฐ๋ฒ
์ ๊ฑฐํ ํน์ง์ ์ ํํ๊ธฐ ์ํด ์๊ด ๋ถ์๋ฑ์ ์งํํ ์ ์๋ค
์๊ด ๋ถ์(Correlation Analysis) & regplot()
์๊ด ๋ถ์ ๋๋ ์๊ด ๊ด๊ณ๋ ํ๋ฅ ๋ก ๊ณผ ํต๊ณํ์์ ๋ ๋ณ์๊ฐ์ ์ด๋ค ์ ํ์ ๋๋ ๋น์ ํ์ ๊ด๊ณ๋ฅผ ๊ฐ๊ณ ์๋์ง์ ๋ํ ๋ฐฉ๋ฒ์ด๋ค
1์ ๊ฐ๊น์ด ๊ฐ : ๋ ๋ณ์๊ฐ์ ์์ ์๊ด๊ด๊ณ
0์ ๊ฐ๊น์ด ๊ฐ : ๋ ๋ณ์๊ฐ์ ์๊ด๊ด๊ณ๊ฐ ์์
-1์ ๊ฐ๊น์ด ๊ฐ : ๋ ๋ณ์๊ฐ์ ์์ ์๊ด๊ด๊ณ
๊ตฌํ
scikit-learn์ ์ด์ฉํด ๊ตฌํํ ์ ์๋ค
corr=df.corr()
plt.figure(figsize=(10, 10))
sns.heatmap(corr,
vmax=0.8,
linewidths=0.01,
square=True,
annot=True,
cmap='YlGnBu');
plt.tilte('Correlation Matrix')
sns.regplot
์ผ๋ก Feature๊ฐ์ ๊ฒฝํฅ์ฑ ์ถ๋ ฅ
sns.regplot(data={dataframe}, x={์ปฌ๋ผ๋ช }, y={์ปฌ๋ผ๋ช })
ํํ๋ฅผ ์ด์ฉํด์ regression line์ด ํฌํจ๋ scatter plot์ ๊ทธ๋ฆด ์ ์๋ค.
Regression ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ณด์คํด ๋ถ๋์ฐ ๊ฐ๊ฒฉ ์์ธกํด๋ณด๊ธฐ (EDA & Feature Selection)
1970๋ ๋์ ๋ณด์คํด ์ง์ญ์ ๋ถ๋์ฐ ๊ฐ๊ฒฉ์ ์์งํ ๋ฐ์ดํฐ
Feature ๋ฐ์ดํฐ : 13๊ฐ
๋ฐ์ดํฐ ๊ฐ์ : 506๊ฐ
Target data : ๋ณด์คํด ๋ถ๋์ฐ ์ง๊ฐ (๋จ์ : $1000)
์ฌ์ฉ ์๊ณ ๋ฆฌ์ฆ
LinearRegression
์ถ๊ฐ์ ์ธ ์ ์ฉ๊ธฐ๋ฒ
Feature Selection
๋ณด์คํด ๋ถ๋์ฐ ๋ฐ์ดํฐ์ ํน์ง๋ค(Features)
CRIM: ๋์๋ณ ๋ฒ์ฃ๋ฐ์๋ฅ
ZN: 25,000ํ์ ๋๋ ํ ์ง์ ๋น์จ
INDUS: ๋์๋ณ ๋น์์ ์ง๊ตฌ์ ๋น์
CHAS: ์ฐฐ์ค ๊ฐ์ ๋๋ฏธ ๋ณ์(1 = ๊ฐ์ ๊ฒฝ๊ณ, 0 = ๋๋จธ์ง)
NOX: ์ผ์ฐํ์ง์ ๋๋
RM: ์ฃผ๊ฑฐํ ์ ์๋ ํ๊ท ๋ฐฉ์๊ฐ์
AGE: 1940๋ ์ด์ ์ ์ง์ด์ง ์ฃผํ์ ๋น์จ
DIS: 5๊ฐ์ ๊ณ ์ฉ์ง์์ผํฐ๊น์ง์ ๊ฐ์ค์น๊ฐ ๊ณ ๋ ค๋ ๊ฑฐ๋ฆฌ
RAD: ๊ณ ์๋๋ก์ ์ ๊ทผ ์ฉ์ด์ฑ์ ๋ํ ์งํ
TAX: 10,000๋ฌ๋ฌ๋น ์ฌ์ฐ์ธ ๋น์จ
PTRATIO: ๋์๋ณ ๊ต์ฌ์ ํ์์ ๋น์จ
B: ๋์์ ํ์ธ ๊ฑฐ์ฃผ ๋น์
LSTAT: ์ ์๋์ธต์ ๋น์จ
์ ์ฒด ํน์ง(Feature)๋ฅผ ์ฌ์ฉํ Linear Regression
X = boston_house_data.data
y = boston_house_data.target
type(X)
numpy.ndarray
from sklearn.model_selection import KFold
num_split = 5
kf = KFold(n_splits=num_split)
avg_MSE = 0.0
for train_index, test_index in kf.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
# ์ ํํ๊ท(Linear Regression) ๋ชจ๋ธ ์ ์ธํ๊ธฐ
lr = LinearRegression()
# ์ ํํ๊ท(Linear Regression) ๋ชจ๋ธ ํ์ตํ๊ธฐ
lr.fit(X_train, y_train)
# ํ
์คํธ ๋ฐ์ดํฐ์ ๋ํ ์์ธก์ ์ํํฉ๋๋ค.
y_pred = lr.predict(X_test)
# MSE(Mean Squared Error)๋ฅผ ์ธก์ ํฉ๋๋ค.
avg_MSE = avg_MSE + mean_squared_error(y_test, y_pred)
print('Average MSE :', avg_MSE/num_split)
print('Avergae RMSE :', np.sqrt(avg_MSE/num_split))
Average MSE : 37.13180746769903
Avergae RMSE : 6.093587405436885
์๊ด๋ถ์(Correlation Analysis)
boston_house_df = pd.DataFrame(boston_house_data.data, columns = boston_house_data.feature_names)
boston_house_df['PRICE'] = y
boston_house_df.head()
CRIM
ZN
INDUS
CHAS
NOX
RM
AGE
DIS
RAD
TAX
PTRATIO
B
LSTAT
PRICE
0
0.00632
18.0
2.31
0.0
0.538
6.575
65.2
4.0900
1.0
296.0
15.3
396.90
4.98
24.0
1
0.02731
0.0
7.07
0.0
0.469
6.421
78.9
4.9671
2.0
242.0
17.8
396.90
9.14
21.6
2
0.02729
0.0
7.07
0.0
0.469
7.185
61.1
4.9671
2.0
242.0
17.8
392.83
4.03
34.7
3
0.03237
0.0
2.18
0.0
0.458
6.998
45.8
6.0622
3.0
222.0
18.7
394.63
2.94
33.4
4
0.06905
0.0
2.18
0.0
0.458
7.147
54.2
6.0622
3.0
222.0
18.7
396.90
5.33
36.2
corr = boston_house_df.corr()
plt.figure(figsize=(10, 10));
sns.heatmap(corr,
vmax=0.8,
linewidths=0.01,
square=True,
annot=True,
cmap='YlGnBu');
plt.title('Feature Correlation');

regplot์ผ๋ก ๋ณด๋ ์๊ด๊ด๊ณ
figure, ax_list = plt.subplots(nrows=3, ncols=5)
figure.set_size_inches(20,20)
for i in range(len(full_column_list)):
sns.regplot(data=boston_house_df, x=full_column_list[i], y='PRICE', ax=ax_list[int(i/5)][int(i%5)])
ax_list[int(i/5)][int(i%5)].set_title("regplot " + full_column_list[i])

์ ์๋ฏธํ Feature๋ค๋ง์ ๋จ๊ธฐ๋ Feature Selection
print(type(corr))
corr
<class 'pandas.core.frame.DataFrame'>
CRIM
ZN
INDUS
CHAS
NOX
RM
AGE
DIS
RAD
TAX
PTRATIO
B
LSTAT
PRICE
CRIM
1.000000
-0.200469
0.406583
-0.055892
0.420972
-0.219247
0.352734
-0.379670
0.625505
0.582764
0.289946
-0.385064
0.455621
-0.388305
ZN
-0.200469
1.000000
-0.533828
-0.042697
-0.516604
0.311991
-0.569537
0.664408
-0.311948
-0.314563
-0.391679
0.175520
-0.412995
0.360445
INDUS
0.406583
-0.533828
1.000000
0.062938
0.763651
-0.391676
0.644779
-0.708027
0.595129
0.720760
0.383248
-0.356977
0.603800
-0.483725
CHAS
-0.055892
-0.042697
0.062938
1.000000
0.091203
0.091251
0.086518
-0.099176
-0.007368
-0.035587
-0.121515
0.048788
-0.053929
0.175260
NOX
0.420972
-0.516604
0.763651
0.091203
1.000000
-0.302188
0.731470
-0.769230
0.611441
0.668023
0.188933
-0.380051
0.590879
-0.427321
RM
-0.219247
0.311991
-0.391676
0.091251
-0.302188
1.000000
-0.240265
0.205246
-0.209847
-0.292048
-0.355501
0.128069
-0.613808
0.695360
AGE
0.352734
-0.569537
0.644779
0.086518
0.731470
-0.240265
1.000000
-0.747881
0.456022
0.506456
0.261515
-0.273534
0.602339
-0.376955
DIS
-0.379670
0.664408
-0.708027
-0.099176
-0.769230
0.205246
-0.747881
1.000000
-0.494588
-0.534432
-0.232471
0.291512
-0.496996
0.249929
RAD
0.625505
-0.311948
0.595129
-0.007368
0.611441
-0.209847
0.456022
-0.494588
1.000000
0.910228
0.464741
-0.444413
0.488676
-0.381626
TAX
0.582764
-0.314563
0.720760
-0.035587
0.668023
-0.292048
0.506456
-0.534432
0.910228
1.000000
0.460853
-0.441808
0.543993
-0.468536
PTRATIO
0.289946
-0.391679
0.383248
-0.121515
0.188933
-0.355501
0.261515
-0.232471
0.464741
0.460853
1.000000
-0.177383
0.374044
-0.507787
B
-0.385064
0.175520
-0.356977
0.048788
-0.380051
0.128069
-0.273534
0.291512
-0.444413
-0.441808
-0.177383
1.000000
-0.366087
0.333461
LSTAT
0.455621
-0.412995
0.603800
-0.053929
0.590879
-0.613808
0.602339
-0.496996
0.488676
0.543993
0.374044
-0.366087
1.000000
-0.737663
PRICE
-0.388305
0.360445
-0.483725
0.175260
-0.427321
0.695360
-0.376955
0.249929
-0.381626
-0.468536
-0.507787
0.333461
-0.737663
1.000000
useful_feature_list = corr.query("PRICE > 0.5 or PRICE < -0.5").index.values.tolist()
useful_feature_list.remove('PRICE')
print(useful_feature_list)
['RM', 'PTRATIO', 'LSTAT']
X = boston_house_df.loc[:,useful_feature_list].values
y = boston_house_df.iloc[:,-1].values
print(X.shape)
print(y.shape)
(506, 3)
(506,)
Feature Selection ๊ฒฐ๊ณผ with K-fold
num_split = 5
kf = KFold(n_splits=num_split)
avg_MSE = 0.0
for train_index, test_index in kf.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
# ์ ํํ๊ท(Linear Regression) ๋ชจ๋ธ ์ ์ธํ๊ธฐ
lr = LinearRegression()
# ์ ํํ๊ท(Linear Regression) ๋ชจ๋ธ ํ์ตํ๊ธฐ
lr.fit(X_train, y_train)
# ํ
์คํธ ๋ฐ์ดํฐ์ ๋ํ ์์ธก์ ์ํํฉ๋๋ค.
y_pred = lr.predict(X_test)
# MSE(Mean Squared Error)๋ฅผ ์ธก์ ํฉ๋๋ค.
avg_MSE = avg_MSE + mean_squared_error(y_test, y_pred)
print('Average MSE :', avg_MSE/num_split)
print('Avergae RMSE :', np.sqrt(avg_MSE/num_split))
Average MSE : 34.10008149030686
Avergae RMSE : 5.839527505741099
๊ฒฐ๋ก
์ฑ๋ฅ์ด ๋ ์ข์์ง ๊ฒ์ ์ ์ ์๋ค
์ด์
Average MSE : 37.13180746769903
Avergae RMSE : 6.093587405436885
์ดํ
Average MSE : 34.10008149030686
Avergae RMSE : 5.839527505741099
Feature Engineering - Feature Normalization
Feature๊ฐ์ ๋ฒ์๋ฅผ ์กฐ์ ํ๋ ๊ธฐ๋ฒ
Feature๋ฅผ ์ ๊ทํ ํ ๊ฒฝ์ฐ ๋ ์์ ์ ์ผ๋ก ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ํ์ต์ํฌ ์ ์๋ค
Min-Max Scaling์ ํ ์๋ ์๋ค. ์ด ๋๋ ๋ชจ๋ ๊ฐ์ด 0์์ 1์ฌ์ด์ ์์นํ๊ฒ ๋๋ค.
x' = (x - min) / (max- min)
from sklearn import preprocessing
normalized_data = preprocessing.StandardScaler().
fit_transform(data)
from sklearn import preprocessing
normalized_data = preprocessing.MinMaxScaler().
fit_transform(data)
Feature Engineering - Feature Generation
๊ธฐ์กด์ ํน์ง๊ฐ๋ค์ ์กฐํฉํด์ ์๋ก์ด ํน์ง์ ๋ง๋๋ ๋ฐฉ์
๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ์์ PolynomialFeature ๋ฐฉ๋ฒ์ด๋ค
์๋ก ๋ค๋ฅธ ํน์ง๋ค๊ฐ์ ๊ณฑ์ ์ ์๋ก์ด Feature๋ก ๋ง๋ ๋ค
์๋ฅผ ๋ค๋ฉด ๋ฒ์ฃ์จ x1๊ณผ ์ ์๋์ธต ๋น์จ x2๋ฅผ ๊ณฑํด ์๋ก์ด ํน์ง x1*x2 ๋ฅผ ๋ง๋ ๋ค
์๋ ํจ์๋ ๋ณด์คํด ๋ถ๋์ฐ์ ๋ํ 13๊ฐ์ ํน์ง์ 91๊ฐ์ ์๋ก์ด ํน์ง์ ์ถ๊ฐํ์ฌ ์ด 104๊ฐ์ ํน์ง์ ๋ฐํํ๊ฒ ๋๋ค
from sklearn.preprocessing import MinMaxScaler,
PolynomialFeatures
def load_extended_boston():
boston = load_boston()
X = boston.data
X = MinMaxScaler().fit_transform(boston.data)
X = PolynomialFeatures(degree=2, include_bias=False).
fit_transform(X)
return X, boston.target
Ridge & Lasso & ElasticNet Regression
์๋ ์๋ค์ ํด๋น ์ถ์ฒ์์ ๊ฐ์ ธ์ด
Rdige Regression
L2 Regularization์ ์ด์ฉํด์ ๊ฐ์ค์น w๋ฅผ ์ ํํ๋ ๊ธฐ๋ฒ


Lasso Regression
L1 Regularization์ ์ด์ฉํด์ ๊ฐ์ค์น w๋ฅผ ์ ํํ๋ ๊ธฐ๋ฒ

๋น๊ต

ElasticNet Regression
Ridge์ Lasso๋ฅผ ๊ฒฐํฉํ ๊ธฐ๋ฒ

์ด๋ค ๊ฒ์ ์จ์ผํ ๊น?
์ ๋ต์ ์๋ค.
์ํฉ์ ๋ง๊ฒ ์จ์ผ ํ๋ ๊ฒ์ด ํ๋ต.
์ด ์ํฉ์ ๋ง๊ฒ ์จ์ผํ๋ ๊ธฐ์ค์ ๊ฐ์ด๋๋ก ์ ๊ณตํ๊ณ ์๋ค

Regression ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฅ๋๋ค
๋ฐ์ดํฐ๊ฐ 10๋ง๊ฐ ์ดํ์ธ๊ฐ? => SGD Regressor
์ ์ฒด feature ์ค ํน์ feature์ ์ค์๋๊ฐ ๋ ํฐ๊ฐ? => Lasso, ElasticNet
์ ์ฒด feature์ ์ค์๋๊ฐ ๊ณ ๋ฅด๋ค => Ridge
์ ์๋์ ํ์ง ์๋๊ฐ? => Ensemble Regressor
์ฝ๋๋ ๋ฒจ ๊ตฌํ
from sklearn.linear_model import LinearRegression,
Ridge,
Lasso,
ElasticNet
lr = LinearRegression()
ridge_reg = Ridge()
lasso_reg = Lasso()
elasticnet_Reg = ElasticNet()
ํ์ดํผ ํ๋ผ๋ฏธํฐ
์๊ณ ๋ฆฌ์ฆ์ ์ํด ๋ณ๊ฒฝ๋๋ ํ๋ผ๋ฏธํฐ ์ธ์ ์๊ณ ๋ฆฌ์ฆ ๋์์ด๋๊ฐ ์ค์ ํด์ค์ผ ํ๋ ๊ฐ์
ํ์ดํผ ํ๋ผ๋ฏธํฐ
๋ผ๊ณ ํ๋ค์ ์ ํ ํ์ดํผ ํ๋ฆฌ๋ฏธํฐ ๊ฐ์ ์ ํด์ฃผ๋ ๊ฒ๋ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ค์ํ ์์ ์ค ํ๋
๋ณด์คํด ๋ถ๋์ฐ ๊ฐ๊ฒฉ ์์ธก ์ฑ๋ฅ ํฅ์์์ผ๋ณด๊ธฐ (Feature Generation & Advanced Estimator)
Input data : 104 Dimension (PolynomialFeatures๋ฅผ ์ฌ์ฉํด์ ํ์ฅ๋ Feature Set)
Target data : ๋ณด์คํด ๋ถ๋์ฐ ์ง๊ฐ (๋จ์ : $1000)
์ฌ์ฉ ์๊ณ ๋ฆฌ์ฆ
LinearRegression
Ridge
Lasso
ElasticNet
์ถ๊ฐ์ ์ธ ์ ์ฉ๊ธฐ๋ฒ
Feature Generation (PolynomialFeatures)
Last updated
Was this helpful?