2023. 2. 7. 15:30ใ๐ง๐ป๐ป With Data/๋ฐ์ดํฐ ๋ถ์
์์ฌ๊ฒฐ์ ๋๋ฌด๋ ๋ถ๋ฅ์ ํ๊ท ๋ฌธ์ ์ ๋ชจ๋ ์ ์ฉ์ด ๊ฐ๋ฅํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก,
๊ฒฐ๊ณผ๋์ถ๊ณผ์ ๊ณผ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํด์ํ๊ธฐ์ ๋งค์ฐ ์ ๋ฆฌํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
ํ์ด์ฌ์ ์์ฌ๊ฒฐ์ ๋๋ฌด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ดํท๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ค.
๋ถ์์ ์ฐ์ธ ๋ฐ์ดํฐ๋ ์บ๊ธ์์ ๊ฐ์ ธ์จ ibm hr๋ถ์(ํด์ฌ์ฌ๋ถ ๋ถ๋ฅ) ๋ฐ์ดํฐ์ด๋ค.
์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์๋ฃํ ํ์ธ, ๊ฒฐ์ธก์น ํ์ธ, ๋ฐ์ดํฐ ๋ถํฌ ํ์ธ ๋ฑ์ด ์๋ค.
์ ๋ฐ์ดํฐ๋ ํนํ ์๋ฃํ์ ์ ์ํด์ผ ํ๋ค.
๋ฐ์ดํฐ ์ค๋ช ์ ์ฐธ์กฐํ๋ฉด ์ผํ ์์นํ์ผ๋ก ๋ณด์ด๋ ๋ณ์๋ค์ด ์ฌ์ค์ ๋ช ๋ชฉํ ๋ณ์๋ฅผ ๋ํ๋ด๊ณ ์์์ ์ ์ ์๋ค.
์ด์ด์ง๋ ์ฝ๋๋ค์ ์ค๋ช ์ ์ํ ๊ฒ์ผ๋ก, ๋ค์ฌ์ฐ๊ธฐ ๋ฑ ๊ทธ๋๋ก ๋ณต๋ถ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ฌ์ง๊ฐ ์๋ค.
์ด์ ์ง์ ๊ตฌํ์ ์ํ๋ค๋ฉด ๊นํ๋ธ ๋งํฌ ์์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๋ ํธ์ด ๋ซ๋ค.
์ด์ ์ค๋ช ์ ์ฐธ์กฐํ๋ฉฐ ๋ช ๋ชฉํ์ผ๋ก ๋ณด๋ ๊ฒ์ด ์ ์ ํ ๋ณ์๋ค์ ์นดํ ๊ณ ๋ฆฌ ํ์ผ๋ก ๋ณํํด์ค๋ค.
#์นดํ ๊ณ ๋ฆฌํ์ผ๋ก ๋ณํ # .astype
hr = hr.astype({'JobLevel': 'category', 'StockOptionLevel': 'category', 'Education':'category', 'MaritalStatus':'category','Attrition':'category', 'OverTime':'category', 'Gender':'category', 'BusinessTravel':'category', 'Department':'category','EducationField':'category','JobRole':'category' })
#๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ ๋ณ์ ์ ๊ฑฐ #drop
hr.drop(['EmployeeCount','StandardHours','Over18','EmployeeNumber'],axis=1,inplace=True)
์์ฌ๊ฒฐ์ ๋๋ฌด ์๊ณ ๋ฆฌ์ฆ์ ๋ช ๋ชฉํ ๋ณ์๋ค์ ๋๋ฏธํ(์์นํ)๊ฐ ํ์ํ์ง๋ง,
๋จ์๋ฅผ ๋ง์ถฐ์ฃผ๋ ํ์คํ ์์ ์ ํ์ํ์ง ์๋ค.
๋๋ฏธํ๋ ์ฌ์ดํท๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ OneHotEncoder๋ ํ๋ค์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ get_dummies๋ฅผ ์ด์ฉํ๋ค.
#์์น/๋ช ๋ชฉํ ๋ณ์๋ค ๋ถ๋ฆฌ
num_fea = [column for column in hr_copy.columns if hr_copy[column].dtype != "category"]
cat_fea = [column for column in hr_copy.columns if hr_copy[column].dtype == "category"]
#์ํซ์ธ์ฝ๋
#๋๋ฏธํ
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
dummies = ohe.fit_transform(hr[cat_fea]).toarray()
df_dummies = pd.DataFrame(dummies, columns = ohe.get_feature_names(hr[cat_fea].columns)) hr_dum=pd.concat([hr_copy[num_fea].reset_index(), df_dummies], axis=1) hr_dum.drop('index',inplace=True,axis=1) hr_dum.columns
* ์ฐธ๊ณ ๋ก ํ๋ค์ค์ get_dummies ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์๋ณด๋ค ๋ ๊ฐ๋จํ๊ฒ ๋๋ฏธํ๋ฅผ ์งํํ ์ ์๋ค.
#๋ ์ด๋ธ ๋ถํฌ ํ์ธ
x = hr_dum y = hr.Attrition
y.value_counts()
์ ์ฝ๋ ๊ฒฐ๊ณผ, y, ์ฆ, ๋ ์ด๋ธ์ ํด๋์ ์๊ฐ 1233(ํด์ฌx) : 237(ํด์ฌo)๋ก ๋ถ๊ท ํํ ์ํ์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด์, ์ ์ ํด๋์๋ฅผ ๋์ฌ์ฃผ๋ ์ค๋ฒ์ํ๋ง์ด๋ ๋ง์ ํด๋์๋ฅผ ๋ฎ์ถฐ์ฃผ๋ ์ธ๋์ํ๋ง์ ํ ํ์๊ฐ ์๋ค.
๊ทธ๋ฐ๋ฐ, ์ค๋ฒ์ํ๋ง์ ์๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ณ ์ ์ ํน์ฑ ๋ด์ง๋ ๋ถํฌ๋ฅผ ๋์ฑ ํฌ๊ฒ ์๊ณก์ํจ๋ค.
์ด์ ์๋์ ์ผ๋ก ๊ทธ ์๊ณก์ด ์ ์ ์ธ๋์ํ๋ง์ ์งํฅํ ํ์๊ฐ ์๋ค. (๋จ, ๋ฐ์ดํฐ ์๊ฐ ์ถฉ๋ถํ ํฌ๋ค๋ฉด)
#oss ์ธ๋ ์ํ๋ง
from imblearn.under_sampling import *
X_samp, y_samp = OneSidedSelection().fit_resample(x,y)
์ฌ๊ธฐ์๋ ์ฌ๋ฌ ์ธ๋์ํ๋ง ๋ฐฉ๋ฒ ์ค oss๋ฅผ ์ฌ์ฉํ์๋๋ฐ,
์ด๋ ์์ ํด๋์ค์ ๋ฐ์ดํฐ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ํฐ ํด๋์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์์ ์ง์ฐ๋ "ํ ๋งฅ๋ญํฌ"์
ํฐ ํด๋์ค์์ ์์ ํด๋์ ์ง๋์น๊ฒ ๊ฑฐ๋ฆฌ๊ฐ ๋จผ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ "cnn"๊ธฐ๋ฒ์ ํฉ์น ๊ธฐ๋ฒ์ด๋ค.
์ฆ, oss๋ ๋์ ์ฅ์ ์ ์์ ๊ธฐ๋ฒ์ผ๋ก, ๋ฐ์ดํฐ์ ์ค์ฌ๋ถํฌ๋ ์ ์งํ๋ฉด์ ๋ถ๋ฅ์ง์ ์ ๊ฐ๊น์ด ๊ฐ๋ค๊ณผ ์ง๋์น๊ฒ ๋ฉ๋ฆฌ ์๋ ์ด์์น๋ค์ ์ ๊ฑฐํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
# ๋ฐ์ดํฐ ๋ถํ
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X_samp, y_samp, test_size=.2, shuffle = True, stratify = y_samp,random_state = 2)
ํ์ต ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ 8:2๋ก ๋ถํ ํ๋ค.
#๋ชจ๋ธ ๋ง๋ค๊ธฐ, ํ์ต
from sklearn.tree import DecisionTreeClassifier #์์ฌ๊ฒฐ์ ๋๋ฌด ์ฝ๋ import
max_depth = [5,6,7,8,9,10]
for i in max_depth:
dt_md = DecisionTreeClassifier(min_samples_leaf = 20 , criterion = "entropy",max_depth = i, class_weight= 'balanced',random_state = 2) # ์ต๋์ฑ์ฅ๊น์ด๋ฅผ ๋ฐ๊ฟ๊ฐ๋ฉฐ ๋ชจ๋ธ๋งdt_md.fit(x_train,y_train) #ํ์ต
print("max_depth:",i)
print('์ ํ๋:',dt_md.score(x_test,y_test))
์ ์ฝ๋๋ ์์ฌ๊ฒฐ์ ๋๋ฌด ๋ชจ๋ธ์ ๋ง๋ค์ด ํ์ต์ํค๋ ์ฝ๋์ด๋ค.
DecisionTreeClassifier()๋ก ๋ชจ๋ธ์ ๋ง๋ค๊ณ .fit()์ ํตํด ๋ชจ๋ธ์ ํ์ต ๋ฐ์ดํฐ๋ฅผ ์ ํฉ์ํจ๋ค.
์์์ ์ฃผ๋ชฉํด์ผํ ๊ฒ์ DecisionTreeClassifier(min_samples_leaf = 20 , criterion = "entropy",max_depth = i, class_weight= 'balanced',random_state = 2) ์ธ๋ฐ,
min_samples_leaf =20 # ์ ๋ ธ๋ ์ต์ ๋ฐ์ดํฐ ์ 20
criterion = "entropy" # ์ํธ๋กํผ๋ก ๋ถ๊ธฐ
max_depth = #์ต๋ ์ฑ์ฅ์น
class_weight = 'balanced' # class ๊ฐ์ค์น ๋ถ์ฌ
random_state = 2 # ๋ชจ๋ธ ๊ณ ์
์ด์ ๊ฐ์ "ํ์ดํผ ํ๋ผ๋ฏธํฐ"๋ฅผ ์ง์ ํ ์ ์๋ค.
์ด๋ ๊ณผ์ ํฉ, ๊ณผ์์ ํฉ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ๊ณผ ๋๋ถ์ด ๋ชจ๋ธ์ ์ฑ๋ฅ์๋ ํฐ ์ํฅ์ ์ฃผ๋ ๊ฒ๋ค์ด๋ค.
์ ์ฝ๋์์๋ ๊ณผ์ ํฉ ๋ฐฉ์ง๋ฅผ ์ํด ์ต๋ ์ฑ์ฅ์น๋ณ ๋ชจ๋ธ์ ์ ํ๋๋ฅผ ๋ฐํํ๋๋ก ํ์๋ค.
์ ๊ฒฐ๊ณผ๋ ๋๋ฌด๊ฐ ๊น๊ฒ ์ฑ์ฅํ๋ค๊ณ ํด์ ์ ํ๋๊ฐ ํฅ์๋์ง ์๊ณ ์คํ๋ ค ๋จ์ด์ง๊ณ ์์์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
์ด๋ ๊ณผ์ ํฉ ๋ฌธ์ ๋ก, ํ์ต ๋ฐ์ดํฐ์ ์ง๋์น๊ฒ ์ ํฉ๋ ๋ชจ๋ธ์ด๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ฐ๋๋ก ๋๋ฌด๊ฐ ์๊ฒ ์ฑ์ฅํ๋ค๋ฉด ๊ทธ ๋ชจ๋ธ์ ์ค๋ช ๋ ฅ์ด ๋จ์ด์ง๋ ๋ฌธ์ ์ ์ด ์๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ์ด ์ ํ๋๋ฅผ ํ์ธํด๊ฐ๋ฉฐ max_depth์ ํฌํจํ ์ฌ๋ฌ ํ์ดํผ ํ๋ผ๋ฏธํฐ๋ค์ ์ ์ ํ๊ฒ ๊ฒฐ์ ํด์ผ ํ๋ค.
#์๊ฐํ
from sklearn import tree
import graphviz
dot_data = tree.export_graphviz(dt_5, # ์์ฌ๊ฒฐ์ ๋๋ฌด ๋ชจํ ๋์ out_file = None, # file๋ก ๋ณํํ ๊ฒ์ธ๊ฐ feature_names = x_test.columns, # feature ์ด๋ฆ class_names = ['NO','YES'], # target ์ด๋ฆ filled = True, # ๊ทธ๋ฆผ์ ์์์ ๋ฃ์๊ฒ์ธ๊ฐ rounded = True, # ๋ฐ์ฌ๋ฆผ์ ์งํํ ๊ฒ์ธ๊ฐ special_characters = True) # ํน์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋
graph = graphviz.Source(dot_data)
graph
์์ ๊ฐ์ด graphviz๋ฅผ ํตํด ์์ฌ๊ฒฐ์ ๋๋ฌด๋ฅผ ์๊ฐํํ ์ ์๋ค.
์๊ฐํ๋ ๋ชจ๋ธ์ ์ดํด์ ํด์์ ๋๋ ๋งค์ฐ ํจ๊ณผ์ ์ธ ๋๊ตฌ์ด๋ค.
๋ชจ๋ธ์ ๋ง๋ค๊ณ ํ์ต์ํจ ํ, ํด๋น ๋ชจ๋ธ์ ๋ํ ์ฑ๋ฅ์ ํ๊ฐํ๋ ๊ฒ ๋ํ ์ค์ํ๋ค.
#๋ถ๋ฅ_๋ ํฌํธ ์ถ๋ ฅ
from sklearn.metrics import classification_report
print(classification_report(y_test, y_predict, target_names = ["F", "T"])) #(์ค์ ๊ฐ, ์์ธก ๊ฐ)์์
์ ๊ฐ๋ค์ ๋ถ๋ฅ์ฑ๋ฅ์ ํ๊ฐํ๋ ์งํ๋ค์ด๋ค. (F: ํด์ฌ x, T: ํด์ฌ o)
accuracy(์ ํ๋): ์ ์ฒด ๊ฐ๋ค ์ค ์์ธก๊ฐ์ด ๋ง์ ๊ฒ์ ๋น์จ
precision(์ ๋ฐ๋): ์์ธก ๊ฐ๋ค ์ค์์ ์ค์ ๊ฐ๊ณผ ๋ง๋ ๊ฒ๋ค์ ๋น์จ
recall(์ฌํ์จ): ์ค์ ๊ฐ๋ค ์ค์์ ์์ธก ๊ฐ์ด ๋ง๋ ๊ฒ๋ค์ ๋น์จ
f1-score: Precision๊ณผ Recall์ ์กฐํํ๊ท (2*(Recall * Precision) / (Recall + Precision)
* f1-score๋ ํด๋์ค ๋ถ๊ท ํ์ด ์ฌํ ๋ ์ ๋ฐ๋์ ์ฌํ์จ์ ๋ณด์ ํ ์ฑ๋ฅ์ผ๋ก ์ด์ฉํ๋ค.
- ์ ์ผ์ด์ค๋ ์ค์ T(ํด์ฌ o)๊ฐ F(ํด์ฌ x)๋ณด๋ค ์ ๊ธฐ ๋๋ฌธ์ precison์ด ๋ฎ๊ฒ ๋์ฌ ์ ๋ฐ์ ์๋ค.
๋๋ฌธ์ ์ฌํ์จ๊ณผ ์กฐํํ๊ท ์ ๊ตฌํด ์ฑ๋ฅ์ ํ๊ฐํ๋ค.
support: ๊ฐ ๋ ์ด๋ธ(F: ํด์ฌ x, T: ํด์ฌ o)์ ์ํ ์
marco avg: ๋จ์ ํ๊ท
weighted avg: ํด๋์ค์ ๋ถ๊ท ํ์ ๊ฐ์ค์น๋ก ๋ฐ์ํ์ฌ ์ฐ์ถํ ํ๊ท
*์ ํํ ์ฝ๋ ์ฐธ์กฐ
https://github.com/Reign2121/Mining-project
https://seollane22.tistory.com/15
'๐ง๐ปโ๐ป With Data > ๋ฐ์ดํฐ ๋ถ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[R] Cox PH model [Survival Analysis] (0) | 2023.02.01 |
---|---|
[R] ์ ํํ๊ท, ๋ก์ง์คํฑํ๊ท [Regression Analysis] (2) | 2023.01.25 |
[R] ์นดํ๋ ๋ง์ด์ด(kaplan-meier) [Survival Analysis] (2) | 2023.01.10 |