EDA (Exploratory Data Analysis)
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
train = pd.read_csv("C:/Users/twink/Documents/์นด์นด์คํก ๋ฐ์ ํ์ผ/train.csv")
test = pd.read_csv("C:/Users/twink/Desktop/test.csv")
sub = pd.read_csv("C:/Users/twink/Desktop/sample_submission.csv")
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ ์ด๋ค ํํ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ์ดํด๋ณด๊ธฐ
- shape ํ์ธํ๊ธฐ
#ํ๊ณผ ์ด์ ๊ฐ์
print(train.shape)
print(test.shape)
train.columns
test.columns
train ๊ณผ test ์ columns ์ค๋ช
psfMag, fiberMag, petroMag, modelMag
- psfMag : ๋จผ ์ฒ์ฒด๋ฅผ ํ ์ ์ผ๋ก ๊ฐ์ ํ์ฌ ์ธก์ ํ ๋น์ ๋ฐ๊ธฐ
- fiberMag : 3์ธ์น ์ง๋ฆ์ ๊ด์ฌ์ ๋ฅผ ์ฌ์ฉํ์ฌ ๊ด์คํํธ๋ผ์ ์ธก์ ํ๋ค. ๊ด์ฌ์ ๋ฅผ ํต๊ณผํ๋ ๋น์ ๋ฐ๊ธฐ
- petroMag : ์ํ์ฒ๋ผ ๋๋ ทํ ํ๋ฉด์ด ์๋ ์ฒ์ฒด์์๋ ๋น์ ๋ฐ๊ธฐ๋ฅผ ์ธก์ ํ๊ธฐ ์ด๋ ต๋ค. ์ฒ์ฒด์ ์์น์ ๊ฑฐ๋ฆฌ์ ์๊ด์์ด ๋น์ ๋ฐ๊ธฐ๋ฅผ ๋น๊ตํ๊ธฐ ์ํ ์์น
- modelMag : ์ฒ์ฒด ์ค์ฌ์ผ๋ก๋ถํฐ ํน์ ๊ฑฐ๋ฆฌ์ ๋ฐ๊ธฐ
Mag - magnitudes (๊ด๋ : ๊ด์์์ ๋์ค๋ ๋น์ ๋ฐ๊ธฐ์ ๊ด๊ณ๋๋ ๊ฒ, ๊ฐ์๊ด์ ์ ์๊น์ ๋ฐ๋ฅธ ์ฌ๋ ๋์ ๊ฐ๋๋ฅผ ๊ณ ๋ คํด์ ํ์ฅ์ ๋ฐ๋ฅธ ๊ฐ์ค์น๋ฅผ ์ฃผ์ด์ ์ป๋ ๊ฐ)
ํ์ฅ๋
u : Ultraviolet ์์ธ์
g : Green ๊ฐ์๊ด์ ์ ์ด๋ก์ ๋ถ๋ถ
r : Red ๊ฐ์๊ด์ ์ ๋นจ๊ฐ์ ๋ถ๋ถ
i : Near Infrared ๊ทผ์ ์ธ์ (์ ์ธ์ ์ค ํ๋)
z : Infrared ์ ์ธ์
์์ธ์ : ํ์ฅ์ด 10~400nm ๋ฒ์์ธ ์ ์ํ(EMR) ๋ก ๊ฐ์๊ด ์ ๊ณผ X์ ์ฌ์ด์ ์์น
๊ทผ์ ์ธ์ : ํ์ฅ์ด 750-2500nm์ธ ์ ์๊ธฐ ์คํํธ๋ผ ๋ด์ ๊ฐ์๊ด์ ์ ์ธ์ ํ ์ ์ธ์ ๋ณต์ฌ
์ ์ธ์ : ํ์ฅ์ด ๊ฐ์๊ด์ ๋ณด๋ค ๊ธธ๊ณ ์ ํ ๋ณด๋ค ์งง์ ์ ์ํ
์ u g r i z ํ์ฅ๋์ผ๊น ..
ugriz ์ธก๊ด ์์คํ ์ SDSS (Sloan Digital Sky Survey) ์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ผ๋ฉฐ SDSS ์ธก๊ด ์์คํ ์ด๋ผ๊ณ ๋ ํ๋ค.
pandas ์ ๋ฉ์๋๋ฅผ ํตํ ๊ฐ๋จํ ํ์
- .head() : ์์ 5๊ฐ, ๊ดํธ ์์ ์ซ์๋ก ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ
train_data.head()
๊ฐ feature ์ ๋ํ ํตํฉ์ ์ธ ์ ๋ณด 2๊ฐ์ง
- .info()
- .describe()
train.info()
๊ฐ feature์ ์๋ ๋ฐ์ดํฐ์ ๋ช ๊ฐ์ null ์ด ์๊ณ , ๊ฐ ๋ฐ์ดํฐ์ type์ ํ์ธํ ์ ์๋ค.
object ๋ ์์นํ์ด ์๋ ์๋ฃํ์ผ๋ก ์ดํดํ๋ฉด ๋๋ค. ๋๋ถ๋ถ string ์ด๋ค.
์ด๋ object ์ธ feature ๋ ๋๋ถ๋ถ์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ง์ ์ ์ธ ์ ๋ ฅ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ผ๋ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ด ํ์ํ๋ค.
train.describe()
describe ๋ฅผ ์ฌ์ฉํ์ฌ ์์นํ ๋ฐ์ดํฐ์ ํต๊ณ๊ฐ์ ์ถ์ถํ ์ ์๊ณ ์ด์์น๋ฅผ ํ์ธํ๋ค.
- count : ๊ฐ์
- mean : ํ๊ท
- std : ํ์ค ํธ์ฐจ
- min : ์ต์๊ฐ
- 25% : ์ 1์ฌ๋ถ์๊ฐ
- 50% : ์ค์๊ฐ, ์ค์๊ฐ
- 75% : ์ 3์ฌ๋ถ์๊ฐ
- max : ์ต๋
๊ฒฐ์ธก์น ํ์ธ
train.isna().sum()
- ๊ฒฐ์ธก์น๊ฐ ์๋๊ฒ์ ์ ์ ์๋ค.
type ์๊ฐํ
- seaborn ์ฌ์ฉํ๊ธฐ
- seaborn ์ matplotlib ๊ธฐ๋ฐ์ ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํต๊ณ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํ ๊ณ ๊ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
#๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์ถ
import seaborn as sns
plt.figure(figsize=(10,8))
sns.countplot(y=train['type'], order=train['type'].value_counts().index)
plt.show()
type ์ปฌ๋ผ์ ๊ฐ๋ค์ count ํ์ฌ ๋ง๋๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์๋ค.
-> QSO ๊ฐ ๋ค๋ฅธ ํด๋์ค์ ๋นํด ์๋ฑํ ๋์ ์์น๋ก ํด๋์ค ๊ฐ์ ์ฌํ ๋ถ๊ท ํ ํด๋์ค๋ฅผ ๊ฐ์ก๋ค.
fiberID ์๊ฐํ
- fiberID ๊ฐ 640 ์ฏค์ด ๋๋ฉด์ ๋ถํฐ ๊ทธ ์๊ฐ ํ์ฐํ ์ค์ด๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
fiberID ๊ฐ 640๋ถํฐ ์๊ฐ ์ค์ด๋๋ ์ด์ ์์๋ณด๊ธฐ
train.groupby('type')['fiberID'].max()
๊ฐ ํด๋์ค๋ณ ์ต๋๊ฐ์ ์์๋ณด์๋ค.
- fiberID ๊ฐ QSO ๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ 640์ ๋๊ธฐ์ง ์์ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
- ์ธ๋์ํ๋ง๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก fiberID ๊ฐ 640 ์ด์ ์ธ๊ฒ์ ์ ์ธํ๋ฉด QSO ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ํด๋์ค์ ๋นํด ์๋ฑํ ๋์ ํด๋์ค ๋ถ๊ท ํ์ ํด๊ฒฐํ ์ ์์ง ์์๊น ์๊ฐํด๋ณด์๋ค.
์ด์์น ์ฐพ๊ธฐ
๋ฐ์คํ๋กฏ์ ์ฌ์ฉํ์ฌ ์นผ๋ผ๋ณ ์ด์์น๋ฅผ ์๊ฐํํ์ฌ ํ์ธํ์ฌ ๋ณด์๋ค.
for col in train.columns[3:]:
plt.figure(figsize=(15,2))
sns.boxplot(x='type',y=col,data=train)
plt.title(col)
plt.xticks(rotation=-30)
plt.show()
์ฝ๋์ถ์ฒ : [2๋ฑ][JY!] ์ฝ๋ ๊ณต์
์นผ๋ผ๋ณ๋ก ๊ทน๋จ๊ฐ ๋๋ ์ด์์น๊ฐ์ ์ ๊ฑฐํ ํ์์ฑ์ด ๋ณด์ธ๋ค.
์ด์์น๊ฐ ๋ง์ง ์์ง๋ง psfMag_u, petroMag_u ์นผ๋ผ๊ณผ ๊ฐ์ด ๋์ ๋๋ ๊ทน๋จ๊ฐ์ด ์กด์ฌํ๋ ์นผ๋ผ๋ ๋ณด์ธ๋ค.
๊ทธ๋ฌ๋ ์์ง ์ด์์น ๊ฐ์ธ์ง์ ๋ํ ํ์ธ์ ๋ถ๊ฐํ ์ํ
์ค์ผ์ผ๋ง์ด๋ feature engineering ์ ์ํด train ๋ฐ์ดํฐ์ ๊ณผ test ๋ฐ์ดํฐ์ ์ ํฉ์ณ์ ํ๋ฒ์ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋๋์ด ํฐ ๋ฐ์ดํฐ์ ์ผ๋ก ๋ณด์์๋ ์ด์์น๋ก ๋ณด์ด์ง ์๋ ๋ฐ์ดํฐ๋ ์ญ์ ํ๊ฑฐ๋ ๊ฐ๊ณตํ์ง ์๋๊ฒ์ด ์ข๋ค.
๋ฐ๋ผ์ ๋๊ฐ์ ๋ฐ์ดํฐ์ ์ ํฉ์น๋ค ์ด์์น๋ฅผ ํ์ธํ์ฌ ๋ณด์๋ค.
- train ๋ฐ์ดํฐ์ ๊ณผ test ๋ฐ์ดํฐ์ ํฉ์น ํ ์ด์์น ํ์ธํ๊ธฐ
total = pd.concat([train,test], axis=0)
for col in total.columns[3:]:
plt.figure(figsize=(25,4))
sns.boxplot(x='type',y=col,data=total)
plt.title(col)
plt.xticks(rotation=-30)
plt.show()
total ๋ฐ์ดํฐ์ ์ ๋ฐ์คํ๋กฏ์ ํตํด ํ์ธํ์์๋ train ๋ฐ์ดํฐ์ ๊ณผ test ๋ฐ์ดํฐ์ ์ ์ด์์น ๋ถํฌ๊ฐ ๊ฑฐ์ ์ฐจ์ด๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ์ฆ, train ๋ฐ์ดํฐ์ ๊ณผ test ๋ฐ์ดํฐ์ ์ ๋ถํฌ๊ฐ ๊ฑฐ์ ์ผ์นํ๋ค๋ ๊ฒ์ ์์ํด๋ณผ ์ ์์๋ค.
๋ฐ๋ผ์ test ๋ฐ์ดํฐ์ ์ ๋ถํฌ๋ฅผ ๋ฒ์ด๋๋ ๋ฐ์ดํฐ๋ฅผ train ๋ฐ์ดํฐ์ ์์ ์ญ์ ํ์ฌ ๊ทน๋จ๊ฐ์ ์ญ์ ํ๊ธฐ๋ก ํ์๋ค.
for col in train.columns[3:]:
train = train[(train[col] > test[col].min()) & (train[col] < test[col].max())]
train ๋ณ์๋ฅผ ์๋ก ํ ๋นํ์ฌ ์ด์ ๊ฐ์ด test ๋ฐ์ดํฐ์ ์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ ์ฌ์ด์ธ ํ๋ง ์ ์งํ๊ณ ๋๋จธ์ง ํ์ ์ ๊ฑฐํ์๋ค.
์ ์ฒ๋ฆฌ ํ์ ๋ฐ์คํ๋กฏ
LightGBM์ ์ด์ฉํ ๋ชจ๋ธ๋ง
LightGBM ์ ์ ์
Tree ๊ธฐ๋ฐ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ๋งํ๋ค.
Light GBM์ Tree๊ฐ ์์ง์ ์ผ๋ก ํ์ฅ๋๋ ๋ฐ๋ฉด์ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ Tree๊ฐ ์ํ์ ์ผ๋ก ํ์ฅ๋ฉ๋๋ค, ์ฆ Light GBM์ leaf-wise ์ธ ๋ฐ๋ฉด ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ level-wise ์ด๋ค.
์ฅ์ ์ผ๋ก๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ์๋๊ฐ ๋น ๋ฅด๋ฉฐ ํจ์จ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
๋จ์ ์ผ๋ก๋ ๊ณผ์ ํฉ์ ๋ฏผ๊ฐํ์ฌ ์์๋ฐ์ดํฐ์๋ ์ฌ์ฉํ๊ธฐ ์ด๋ ต๋ค.
๋ฐ์ดํฐ
train2 = train.copy()
์ ์ฒ๋ฆฌํ train ๋ฐ์ดํฐ์ ์ train2๋ก ์๋ก ํ ๋นํด ์ฃผ์๋ค.
LGBM ๋ชจ๋ธ ํธ์ถ
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import lightgbm as lgb
ํ์ต์ฉ ๋ฐ์ดํฐ์ ๊ฒ์ฆ์ฉ ๋ฐ์ดํฐ
# type๊ณผ ๋๋จธ์ง ๋ฐ์ดํฐ๋ค์ ๋ถ๋ฆฌํด์ค
X = train2.iloc[:, 2:]
y = train2.iloc[:, 1]
# ๋ฐ์ดํฐ์
๋ถํ (ํ์ต์ฉ ๋ฐ์ดํฐ์ ๊ฒ์ฆ์ฉ ๋ฐ์ดํฐ)
# training๊ณผ test์ ๋น์จ์ 0.3
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
LGBM ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ ์ํ ์ ์ํ ๋ณํ
column_number = {}
for i, column in enumerate(sub.columns):
column_number[column] = i
def to_number(x, dic):
return dic[x]
train2['type_num'] = train2['type'].apply(lambda x: to_number(x, column_number))
๋ชจ๋ธ ๊ตฌํ
lgb_clf = lgb.LGBMClassifier(num_leaves=34, objective='multiclass', max_depth=1)
lgb_clf.fit(X_train, y_train)
y_pred = lgb_clf.predict(X_test)
LightGBM ํ์ดํผํ๋ผ๋ฏธํฐ ์ค์ : ํ๋ผ๋ฏธํฐ๊ฐ 100๊ฐ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋ํ์ ์ธ ํ๋ผ๋ฏธํฐ๋ฅผ ์์๋ณด๊ณ ์ค์ ํ์ฌ ๋ณด์๋ค.
num_leaves: ์ ์ฒด Tree์ leave ์ ์ด๊ณ , ๋ํดํธ๊ฐ์ 31์ด๋ค. ํด์๋ก ์ ํ๋๋ ๋์์ง์ง๋ง ์ค๋ฒํผํ ์ด ๋ฐ์ํ ์ ์๋ค.
min_data_in_leaf: leaf๊ฐ ๊ฐ์ง๊ณ ์๋ ์ต์ํ์ ๋ ์ฝ๋์ด๋ฉฐ ํด์๋ก ์ค๋ฒํผํ ์ ๋ฐฉ์งํ๋ค.
max_depth: Tree์ ์ต๋ ๊น์ด๋ฅผ ๋งํ๋ฉฐ ์๋ฅผ ์ค์ด๋ฉด ๊ณผ์ ํฉ์ ํด๊ฒฐํ ์ ์๋ค.
objective: ์ฌ์ฉํ๋ ๋ฐ์ดํฐ์ ์ ํ๊ฒํ ๊ฐ์ ํํ์ ๋ฐ๋ผ ์์น์์ธก์ด๋ฉด regression, ์ด์ง๋ถ๋ฅ์ด๋ฉด binary ๋ฅผ ์ฌ์ฉํ๋ค.
metric: ์ฑ๋ฅ ํ๊ฐ๋ฅผ ์ด๋ค ๊ฒ์ผ๋ก ํ ๊ฒ์ธ์ง ์กฐ์ ์ด ํ์ํ๋ค.
๋ชจ๋ธ ์ ํ์ฑ ์ถ๋ ฅ
print("Accuracy:", accuracy_score(y_test, y_pred))
์ธ์ฌ์ดํธ ๋์ถ
ํ์ ์ ์๊ฐํํ ๊ฒฐ๊ณผ ํด๋์ค๊ฐ์ ๋ถ๊ท ํ์ด ์ฌํ๊ฒ์ ํ์ธํ ์ ์์๋ค. ๋ํ fiberID ์์ 640 ์ดํ๋ก๋ QSO ๋ง ์กด์ฌํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ์ด๋ฅผ ํตํด QSO ํด๋์ค์์ 640์ ๋๋ ๊ฐ์ ์ญ์ ํ๋ ๋ฑ์ ์ธ๋์ํ๋ง์ ์งํํ๋ฉด ๋ฐ์ดํฐ๊ฐ์ ๋ถ๊ท ํ์ ํด๊ฒฐํ ์ ์์ง ์์๊น ์๊ฐํด๋ณด์๋ค. ๊ทธ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ์ผ์ธ๋งํผ ์ธ๋์ํ๋ง ๋ ๋ฐ์ดํฐ๊ฐ ์๋ณธ ๋ฐ์ดํฐ์ ํน์ฑ์ ์ ๊ฐ๊ณ ์๋ ๊ฒ์ด ์ค์ํด ๋ณด์ธ๋ค.
์ฑ์ฐฐ ๋ฐ ๋๋์
๋ชจ๋ธ๋ง์ ์งํํ๋ฉด์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด LightBGM ์ ์ฌ์ฉํด ๋ณด์๋๋ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ๊ฑฐ๋ ๊ณผ์ ํฉ์ ํผํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋ํด ์ ์์ง ๋ชปํ์ฌ num_leaves ํ๋ผ๋ฏธํฐ๋ง ์กฐ๊ธ์ฉ ์ค์ ํด๋ณด๋ฉฐ ๋ชจ๋ธ๋ง์ ์งํํ์๋ค. ๊ธฐ๋ณธ๊ฐ์ด 31์ธ๋ฐ ํด์๋ก ์ ํ์ฑ์ ๋์ผ ์ ์๋ค๊ณ ํ์ฌ์ ์ ํ์ฑ์ด ๋ค์ ๋ฎ์์ง์ง ์๋ ์ง์ ์ธ 34๋ฅผ ์ค์ ํ์๋ค. ๋ํ objective ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ๋ฉด์ regression ๊ณผ binary ์ค ํ์ต ๋ชฉํ์ ๋ฐ๋ผ ์ค์ ํด์ผ ํ๋๋ฐ ์ด์ ์ ์ธ์งํ์ง ๋ชปํ๋๊ฒ๊ฐ๋ค. ์ด์ฒ๋ผ ํ๋ผ๋ฏธํฐ ์ค์ ์ ๋ํด ๋ฏธ์ํ ์ ์ ๋ณด์ํ๊ณ ์ถ๋ค.
์ฐธ๊ณ ๋ฌธํ
https://dacon.io/competitions/official/235573/codeshare/686?page=1&dtype=recent
https://dacon.io/competitions/official/235573/codeshare/694?page=1&dtype=recent
https://dacon.io/competitions/official/235573/codeshare/693?page=1&dtype=recent
https://www.codeit.kr/community/questions/UXVlc3Rpb246NjBlZTc0YzMyOGRjMDY2Y2ZlYWYwZGE0
https://dacon.io/competitions/official/235573/codeshare/721?page=1&dtype=recent
https://nurilee.com/2020/04/03/lightgbm-definition-parameter-tuning/
'๐ก WIDA > DACON ๋ถ๋ฅ-ํ๊ท' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DACON/์กฐ์์] ์ฒ์ฒด ๋ถ๋ฅ ๊ฒฝ์ง๋ํ (4) | 2023.05.06 |
---|---|
[DACON/์ต๋ค์] ํ๋ก์ ํธ ์์ธ์ด (5) | 2023.05.05 |
[DACON/๊น์ธ์ฐ] ํ๋ก์ ํธ ์์ธ์ด (4) | 2023.05.05 |
[DACON/๊น๊ท๋ฆฌ] ํ๋ก์ ํธ ์์ธ์ด (4) | 2023.05.05 |
[DACON/์ฐธ๊ณ ์๋ฃ] ์์๋ธ ๋ชจ๋ธ (0) | 2023.05.01 |