본문 바로가기
IT,SW,Data,Cloud,코딩/Python

빅분기 실기 대비 요약노트

by 착실하게 2023. 6. 23.
반응형

 

pd.set_option('display.max_columns',None)
이거 설정하면, 중간에 ... 으로 안 나오고, 전부 나온다. 한줄 넘어가는건 아래쪽에 찍힌다. 
설정하고 출발하라는 꿀팁

dir(), help(), __all__
마우스 오른쪽 복사하기, 메모장에 붙여넣기 하고, ctrl + f 로 읽어라. 

표준편차와 분산은 넘파일 말고 판다스로 사용해라.



####################################
# 작업형 1 관련 
df.reset_index() 인덱스컬럼의 일반컬럼화 
df['컬럼'].quantile(0.25) 대상컬럼의 1사분위수 
df.index[0] 데이터프레임의 인덱스 선택
df.T 트랜스포즈 행열전환

최빈값 꺼내올 때는 맨뒤에 [0] 까지 해줘야 한다. 
mod = mem['f3'].mode()[0] 

mem['f3']=mem['f3'].replace(np.nan,0).replace('gold',2).replace('silver',1).replace('vip',3)

map 활용 - 딕셔너리 사용
dict_list = {np.nan:0,'silver':1,'gold':2,'vip':3}
mem['f3'] =mem['f3'].map(dict_list)

조건문의 부정은 ~ 사용 
df = df[~cond]

df.fillna(method='bfill') # 결측값을 가진 데이터는 바로 뒤에 있는 값으로 대체 (바로 뒤가 결측값이라면 뒤에 있는 데이터 중 가장 가까운 값)
df.fillna(method='ffill') # 앞에 있는 데이터로 채우기

데이트타임

# print(df.info()) 
df['subscribed'] = pd.to_datetime(df['subscribed'])
# print(df.info())

df['year'] = df['subscribed'].dt.year
df['month'] = df['subscribed'].dt.month
df['day'] = df['subscribed'].dt.day

 

머신러닝

회귀, 분류 

 


평가지표를 보고 회귀인지, 분류인지 판단하자!
- 회귀: label 값이 연속형인지. 가격,수요량,사용량,판매량 등. 
- 분류: label 값에 종류가 있는지.  


########################################################################################
<피쳐엔지니어링 - numeric, categorical data 분리 (필수로 해주자 !!) >
n_train = train.select_dtypes(exclude='object').copy()
c_train = train.select_dtypes(include='object').copy()
n_test = test.select_dtypes(exclude='object').copy()
c_test = test.select_dtypes(include='object').copy()

<피쳐엔지니어링 - n, c 분리 후 다시 합치기 >
train = pd.concat([n_trian,c_trian],axis=1)
test = pd.concat([n_test,c_test],axis=1)

########################################################################################
<피쳐엔지니어링 - numeric >
스케일링은 선택. 해도 되고 안 해도 된다. 너무 시간투자하지 말 것! 
스케일링은 트리계열(랜덤포레스트, xgboost, lightgbm) 모델에서는 드라마틱한 효과가 없다. 
스케일링은 선형회귀모델은 영향이 조금 있다.

스케일링 방법
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import RobustScaler #다른 2개 대비 이상치에 좀더 강하다

cols = ['col1','col2']
scaler = XXScaler()
n_train[cols] = scaler.fit_transform(n_train[cols])
n_test[cols] = scaler.transform(n_test[cols])
스케일러는 반복문 사용X. 쓰니까 에러났음. 그냥 한번에 전체 컬럼 넣고 해주면 된다. 단, 전/후 눈으로 확인 꼭 해주기!

from sklearn.preprocessing import minmax_scale 
minmax_scale(data['col1'])

로그변환
np.log1p(대상데이터)
*나중에 평가지표에서 np.exp(y_pred) 해서 살펴봐야함


########################################################################################
<피쳐엔지니어링 - categorical>
object컬럼이 있다면 인코딩 적용 안하는 선택지는 없다. 
시간이 있다면 인코딩 2종류만 시도해보자. 

0) 전부 drop 해보거나 

1) 라벨인코딩 
from sklearn.preprocessing import LabelEncoder

cols = ['대상컬럼1','대상컬럼2']
encoder = LabelEncoder()
for col in cols:
  X_train[col] = encoder.fit_transform(X_train[col])
  X_test[col] = encoder.transform(X_test[col])

print(encoder.classes_) # 0,1,2... 순서로 어느 라벨과 매칭되어 있는걸 확인가능
## encoder.inverse_transform(data)도 가능하다. 


2) 원핫인코딩
#train = pd.get_dummies(train) 
#이렇게만 해도 자동으로 범주형(오브젝트) 값만 인코딩해서 저장된다.
#근데 이렇게 하면 원핫인코딩 비대상컬럼이 있는경우 사라져버린다. 

all_data = pd.get_dummies(all_data, columns=['alcohol'])
그래서 이렇게 사용하는 것을 추천!!

<검증용 데이터 분리 validation dataset >===========================================





from sklearn.model_selection import train_test_split

X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train['gender'], test_size=0.2, random_state=2022) 



*주의점: y_train['타겟컬럼'] 으로 넣어주기!!! 


<분류/회귀 머신러닝 통합요약> ===========================================



1) 선형 모델 
선형 모델은 random_state 하이퍼파라메터가 없음 
선형 모델은 데이터가 정규분포를 가지고 있다고 가정하고 구현되었음
from sklearn.linear_model import LogisticRegression 분류
from sklearn.linear_model import LinearRegression 회귀
from sklearn.linear_model import Ridge 회귀
from sklearn.linear_model import Lasso 회귀

2) 트리 > 디시젼트리
from sklearn.tree import DecisionTreeClassifier 분류 
from sklearn.tree import DecisionTreeRegressor 회귀 

3) 앙상블 > 트리의 앙상블 (랜덤인지, 비랜덤인지)  

from sklearn.ensemble import RandomForestClassifier 분류 
from sklearn.ensemble import RandomForestRegressor 회귀 

RandomForest모델.feature_importances_ 변수 중요도 확인 가능

from sklearn.ensemble import GradientBoostingClassifier 분류 
from sklearn.ensemble import GradientBoostingRegressor 회귀 

4) 디시젼트리+ 앙상블
from xgboost import XGBClassifier 분류
from xgboost import XGBRegressor 회귀 
import lightgbm 
model = lightgbm.LGBMClassifier() 분류 
model = lightgbm.LGBMRegressor() 회귀 

xgboost은 예민해서 lightgbm을 추천함. 
y 종류(클래스)가 1,2,3,4인데 xgboost는 0부터 0,1,2,3으로 구성되어야함

<분류 머신러닝> =========================================== 

from sklearn.linear_model import LogisticRegression 분류-선형
from sklearn.tree import DecisionTreeClassifier 분류-디시젼트리
from sklearn.ensemble import RandomForestClassifier 분류-앙상블  
from xgboost import XGBClassifier 분류-디시젼트리+앙상블

import lightgbm 
model = lightgbm.LGBMClassifier() 분류-디시젼트리+앙상블+개선 


<회귀 머신러닝> ===========================================
from sklearn.linear_model import LinearRegression 회귀-선형-선형회귀
from sklearn.linear_model import Ridge 회귀-선형-릿지
from sklearn.linear_model import Lasso 회귀-선형-라쏘
from sklearn.tree import DecisionTreeRegressor 회귀-디시젼트리
from sklearn.ensemble import RandomForestRegressor 회귀-앙상블
from xgboost import XGBRegressor 회귀-디시젼트리+앙상블
import lightgbm 
model = lightgbm.LGBMRegressor() 회귀-디시젼트리+앙상블+개선  

###########################################################################

모델은 프레딕트, 프레딕트_프로바 둘다 사용가능
model.predict()
model.predict_proba()

< 분류 평가지표 사용방법>
분류 평가지표는 프레딕트 사용. ROC_AUC_SCORE만 프레딕트_프로바 사용. 
precision_score : predict 
f1_score : predict 높을수록 성능 좋음 
accuracy_score : predict 
roc_auc_score : predict_proba[:,1]
recall_score : predict 

from sklearn.metrics import classification_report 
classification_report(y_test,y_pred,labesl=[0,1]) 이렇게 한꺼번에 구하기도 가능함. 

< 회귀 평가지표 사용방법>
회귀 평가지표는 프레딕트 사용. 프레딕트_프로바는 사용 불가능함.

###########################################################################

<하이퍼 파라메터 튜닝방법>

하이퍼 파라미터 튜닝 - RandomForestClassifier
max_depth = 트리의 깊이 제한. (3에서 12사이. 보통 3,5,7 범위 추천. 디폴트 = None)
n_estimators = 트리의 갯수. 기본값은 100이다. (100보다 낮추는 케이스는 잘 없음. 100,200,400,800,1000까지. 많이 만들수록 속도는 느려질수밖에 없음)
# (번외) max_features = 0.06 - 최대 선택할 특성의 수 (낮출수록 트리는 달라지고 깊어짐) 디폴트=auto  
# (과적합 방지) min_samples_split : 노드 분리에 필요한 최소 샘플 수 (디폴트=2) 
# (과적합 방지) min_samples_leaf : 리프 노드에 필요한 최소 샘플 수 (디폴트=1) 


하이퍼 파라메터 튜닝 - XGBClassifier
max_depth = 트리깊이의 최댓값. 디폴트=3. 일반적으로 3~10. 최대12 까지. 너무 작으면 과소적합, 너무 크면 과대적합 
n_estimators = 약한 학습기. 부스팅 iteration 수. 디폴트=100. 일반적으로 100~1000. 
랜덤포레스트와 다른 파라메터임. xgboost는 이걸 올릴때에는 반드시 learning_rate 값은 낮춰줘야 한다. 
learning_rate 학습률 0.01 ~ 0.2 디폴트 0.1 
즉, n_estimators = 100 ~ 1000, learning_rate = 0.1 ~ 0.01 


###########################################################################
<평가지표 통합요약> 
import numpy as np 
분류 from sklearn.metrics import precision_score, f1_score, accuracy_score, roc_auc_score, recall_score
회귀 from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error (MSE -> RMSE)


분류 평가지표 pfarr : 높을수록 좋음
 - precision_score 정밀도 - 맞다고 예측한 중 실제 맞은 비율 TP / (FP+TP) 
 , f1_score F1 정밀도와 재현율의 조화 평균 (정밀도와 재현율은 서로 트레이드오프 관계) 2 / [(1/recall) + (1/precision)]
 , accuracy_score 정확도 - 얼마나 많이 맞췄느냐 (TN+TP) / (전체)
 , roc_auc_score ROC_AUC
 , recall_score 재현율 (민감도) - 실제 맞은 사람 중 맞았다고 예측한 비율 TP / (FN+TP) 


회귀 평가지표 
 - R2 (결정계수) : 높을수록 좋음
 - MAE, MSE (E: Error) : 작을수록 좋음 (library 제공됨)
   MAPE, RMSE, RMSLE : 작을수록 좋음 (library 없음) 

회귀 평가지표 설명
R2 Score 회귀 모델의 '설명력' 
MAE (Mean Absolute Error) 오차의 절대값의 평균 
MSE (Mean Squared Error) 오차의 제곱해서 평균

MAPE (Mean Absolute Percentage Error) MAE를 퍼센트로 표시. 
RMSE (Root Mean Squared Error) 오차의 제곱에 루트해서 평균 
RMSLE (Root Mean Squared Log Error) 오차의 로그에 - 예측값이 실제값보다 작을때 더 큰 패널티 부여 (배달이 50분 걸린다고 예측했는데 30분 걸리면 ok, 그런데 20분 걸린다고 했는데 40분 걸리면 안됨.) 


# 회귀 평가 지표 코드 
# 오차: 실제값 - 예측값 
# 평가지표 계산식을 기억하지 못해도, csv 파일제출에는 문제가 없다. 다른 평가지표 사용해서 검증하고 제출하면 된다. 

import numpy as np
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
    
def mape(y_test, y_pred): #MAPE # mean absolute percentage error 
  return np.mean(np.abs((y_test - y_pred) / y_test)) * 100 

def rmse(y_test, y_pred): #RMSE
  return np.sqrt(mean_squared_error(y_test,y_pred))

def rmsle(y_test, y_pred): #RMSLE #root mean squared log error 
  LE = np.log1p(y_test) - np.log1p(y_pred)
  SLE = np.power(LE,2)
  MSLE = np.mean(SLE)
  RMSLE = np.sqrt(MSLE)
  return RMSLE

평가 시, train 데이터에 대한 평가지표도 확인.
train 은 높고 val 은 낮으면, 과적합 된 상태라는 뜻. 

 ########################################################################################
 
진행순서
1. 베이스라인 (drop)
2. 인코딩 
3. 결측치
4. 모델 튜닝
5. 스케일링

 
 <진행순서 상세설명>
 
 1. 베이스라인 (인코딩 없이 drop 사용) - 검증 후 1차 제출
 - 데이터 분할과 랜덤포레스트 모델 random_state값 고정
 2. 인코딩 사용 - 점수 좋아졌다면 2차 제출
 3. 결측치 있다면 다양한 처리 방식 시도 - 점수 좋아졌다면 3차 제출
 4. 모델 튜닝 - 점수 좋아졌다면 4차 제출 
 
 5. 스케일링 (시간적 여유가 있다면) - 점수 좋아졌다면 5차 제출 아니면 패스
 
 
 
 ########
 이런저런 머신러닝이 많지만, 이래저래 제일 무난한건 랜덤포레스트, 라이트gbm이 맞는듯하다. 
 from sklearn.ensemble import (RandomForestClassifier,
                              AdaBoostClassifier,
                              GradientBoostingClassifier,
                              HistGradientBoostingClassifier)
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from catboost import CatBoostClassifier

 

 

 

 

가설검정 관련

 

가설검정
from scipy import stats 

수치형 데이터는 T-검정 ( 모평균 가설검정)
1) 단일표본 t-test (one-sample t-test)
2) 독립표본 t-test (two sample t-test, independent t-test) 
3) 대응(쌍체)표본 t-test (paired t-test) 


유의수준 0.05 하에서 => p-value 값이 0.05 보다 작다면, 귀무가설을 기각하고 대립가설을 채택한다.
유의수준 보다 p-value값이 크면, 귀무가설을 기각하지 못한다.

####################################################################

from scipy.stats import (ttest_1samp, ttest_ind, ttest_rel)
from scipy.stats import chi2_contingency
from scipy.stats import f_oneway

####################################################################

T-검정 = 수치형 데이터. 평균 비교.

one-sample t-test : 모집단1개, 데이터 1개 
two-sample / independent t-test: 모집단2개(모분산 동일여부에 따라 equal_var), 데이터 2개 
paired t-test : 모집단1개, 데이터 2개 (전후비교, 오른쪽왼쪽비교 등)
one-way ANOVA (분산분석/일원배치법): 데이터3개 

ttest_1samp(1st,popmean,alternative='two-sided/greater/less')
ttest_ind(1st,2nd,alternative='two-sided/greater/less',equal_var=True/False)
ttest_rel(1st,2nd,alternative='two-sided/greater/less')

f,p = f_oneway(df['group_A'],df['group_B'],df['group_C'])

####################################################################

# 귀무가설: 평균 2 와 같다. 
# 대립가설: 평균 2 보다 크다. 

result = stats.ttest_1samp(df["커피 몇 잔"],2,alternative = "greater")

print(result.statistic)
print(result.pvalue)


stats.ttest_*(1번째,2번째,alternative='greater/less/two-sided')
대립가설 기준으로, 1번째 데이터가 더 커야 한다면 greater 
대립가설 기준으로, 1번째가 더 작아야 한다면 less
귀무가설이 같고, 대립가설이 같지 않음 이라면 two-sided (디폴트값) 

####################################################################
T-검정 = 수치형 데이터. 
카이스퀘어 = 범주형 데이터.

chi-square 독립성 검정. 두 범주형 변수의 관련성. 독립적인지 아닌지.
# 이번에는 안나올거라는 예측이 있음. 이유는 파이썬라이브러리 결과값에 변수명이 없는데 R은 있음
from scipy.stats import chi2_contingency
귀무가설: A와 B는 독립이다. 
대립가설: A와 B는 독립이 아니다.

df = pd.DataFrame([[50,60],[25,40]])
#      B1, B2 
# A1 : 50, 60 
# A2 : 25, 40 
stat, pv, dof, expected_freq = chi2_contingency(df,correction=True)
# correction=True/False 
#연속성 수정(Yates's correction for continuity): 기본값은 True.

####################################################################
일원배치법. 분산분석. one-way ANOVA 
- 관측치 3개 이상, 그룹 간 평균 비교 (F-value)
- 양측 검정. 방향 없음. 즉, alternative 파라메터 없음 
- 귀무가설: 세 그룹 간의 평균 차이가 없다. 모평균의 차이가 없다. 
- 대립가설: 세 그룹 간의 평균 차이가 있다. 모평균이 모두 같지는 않다. 
- 전제조건: 각 그룹의 데이터는 정규분포를 따르고, 그룹간의 등분산성은 동일하다. 

from scipy.stats import f_oneway
f,p = f_oneway(df['group_A'],df['group_B'],df['group_C'])

####################################################################
# 만약, 정규성 검정 만족하는지, 등분산성 검정 만족하는지 묻는다면? 
# t-test, one-way ANOVA 모두 물어볼 수 있는 부분임. 

정규성 검정 shapiro
- 주어진 데이터가 정규 분포를 따르는지 확인
- 귀무가설: 정규분포를 따른다. 
- 대립가설: 정규분포를 따르지 않는다. (p-value < 유의수준)
from scipy.stats import shapiro 
a = shapiro(df['group_A'])
b = shapiro(df['group_B'])
c = shapiro(df['group_C'])
print('shapiro',a,b,c,sep='\n') # 세개 다 pvalue가 0.05보다 커서, 귀무가설 기각할수 없다. 즉, 정규분포 따른다.

등분산성 검정 levene 
- 그룹 간 분산이 동일한지 확인하는 검정. 
- 귀무가설: 각 그룹 데이터는 등분산을 가진다. 
- 대립가설: 하나 이상의 그룹이 등분산을 가지지 않는다. (p-value < 유의수준)
from scipy.stats import levene
result = levene(df['group_A'],df['group_B'],df['group_C'])
print(result) # pvalue가 0.05보다 커서, 귀무가설 기각할수 없다. 즉, 등분산 검정 만족함.

정규성 검정이나 등분산성 검정에서는 p-value 가 커야, 

귀무가설을 기각할 수 없고, one-way ANOVA 를 적용할 수 있다. 

 

 

그외 추가로 

from sklearn.neighbors import KNeighborsClassifier

model = KNeighborsClassifier( n_neighbors = 5, metric = 'euclidean' ) 
# n_neighbors = 2 부터 9 까지 추천? 

model.fit( X_tr, y_tr.values.ravel() ) 
# y_tr로 해도 되지만 워닝 발생함. ravel()까지 해주면 워닝 안남.

 

 

반응형

댓글