카테고리 없음

빅분기 실기 정리 - 2유형

sueeee-e 2024. 11. 19. 12:19

2유형 기본 흐름

 

1. 데이터 확인 (train, test)

-> 분류: 0또는 1 / 회귀 : 숫자예측 / 다중분류 : 라벨인코더 -> inverser_transform
 

2. 결측치확인 및 제거

-> info(), describe() 로 데이터 타입이나 행, 열, 정보 확인 먼저!
-> isna() , fillna(0) , fillna(df[''].median()) ...  0이나, 중앙값, 평균값 생각하고 넣기 
-> 문자열일 땐 최빈값으로 df['a'].fillna(df['a'].mode()[0], inplace=Ture)
 

3. id, index같은 데이터마다 다른 값이나 예측에 필요없는 값들은 drop해주기 

: train분리, test 각각 필요없는 부분  drop 
X_train = train.drop(['id', '예측칼럼'], axis = 1)
X_test = test.drop(['예측칼럼'], axis=1)
y = train["예측칼럼"]
 

4. 범주형 변수 인코딩(문자열 -> 숫자)

*제출값을 다시 문자열로 해야 하면 마지막에 inverser_transform 해주기

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()

X_train['범주형 col1'] = le.fit_transform(X_train['범주형 col1'])

X_test['범주형 col1'] = le.transform(X_test['범주형 col1'])

X_train['범주형 col2'] = le.fit_transform(X_train['범주형 col2'])

X_test['범주형 col2'] = le.transform(X_test['범주형 col2'])
 

#원핫인코딩은 df = pd.get_dummies(df)로 하기

 

5. 수치형 변수 스케일링 -> 랜덤포레스트 쓸거면 안해도 됨

from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
scaler = [' '] // 스케일링할 칼럼 리스트
->scaler = X_train.select_dtypes(exclude = 'object').columns
min = MinMaxScaler()
X_train[scaler] = min.fit_transform(X_train[scaler])

 

X_test[scaler] = min.transform(X_test[scaler]) #test는 fit말고 transform만

 

 

6.  데이터 나누기.

*train, test 데이터를 주어서 여기서 train에서 나누는 건 훈련, 검증 데이터이다. 
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X_train, y, test_size = 0.2, random_state=41 , stratify=y)
*분류문제에서는 stratify = y해주고 회귀문제에선 금지 (비율 맞추기 위함)
 
6-1 슬라이싱으로 나누기 (train :3800, test:209)
이건 그 전에 train이랑 test랑 합쳤을 때
train = df.iloc[:3800, :]
test = df.iloc[-209:, :]
 

7. 모델 학습

#분류
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier()  //n_estimators = 150, max_depth = 20
rfc.fit(X_train, y_train)
pred1 = rfc.predict(X_val)   #예측
 
from sklearn.ensemble import AdaBoostClassifier
ada = AdaBoostClassifier()
 
from sklearn.ensemble import VotingClassifier
-> clf = VotingClassifier(estimators=[('rfc', rfc), ('ada', ada)] , voting = 'soft')
 
#회귀
from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor(n_estimators = 120, max_depth =15)
rfr.fit(X_train, y_train)
pred = rfr.predict(X_val)
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import VotingRegressor
-> model = VotingRegressor(estimators=[('rfr',rfr),('gbr',gbr)])

 

+교차검증

from sklearn.model_selection import cross_val_score

cross_val_score(estimator, X, y, scoring=평가지표, cv=교차 검증 폴드 수) 

 

model3 = DecisionTreeClassifier(max_depth = 3)

model5 = DecisionTreeClassifier(max_depth = 5) #예시로 의사결정나무 모델, max_depth 의 숫자를 바꿔서 결과 확인을 하고 젤 좋은 성능으로 모델 학습을 시켜준다. 

scores = cross_val_score(model, X_train, y_train, scoring = 'accurary', cv = 10)

-> 교차검증정확도 : print(scores), 평균검증 정확도 : print(np.mean(scores))

 

9. 성능평가

#분류 -> 1에 가까울수록 성능 높음
from sklearn.metrics import
accuracy_score, roc_auc_score, f1_score, precision_score, recall_score
-> accuracy_score(y_val, pred1)

 

 

#회귀 - 보통 작을 수록 좋음
from sklearn.metrics import
mean_squared_error as MSE, mean_absolute_error as MAE,
mean_squared_log_error as MSLE, mean_absolute_percentage_error as MAPE,
r2_score

 

#RMSE = MSE **0.5

#RMSLE = MSLE ** 0.5

-> mse = mean_squared_error(y_val, pred)
-> rmse = np.sqrt(mse)
-> mae = mean_absolute_error(y_val,pred)

 

-> r2 = r2_score(y_val, pred)  : 1에 가까울수록 좋고 음수가 나올 수 있다. (이는 모델이 데이터를 설명 못하는 경우)

 

 

 

10. 제출

실제 테스트데이터로 모델 학습 및 예측
y_pred = model.predict(X_test)
pd.DataFrame({'pred':y_pred}).to_csv('result.csv', index = False)
result = pd.read_csv('result.csv')
print(result) //확인

 

 


간단한 방법 - train, test 합쳐서 전처리한 뒤 다시 나누는 방법

train

test

 

X = train.drop(['예측칼럼'], axis = 1)

y = train['예측칼럼']

 

훈련, 테스트 데이터 합치기

X_full = pd.concat([X, test], axis = 0)

 

전처리도 한 번에 다 하고 X_full[''] = X_full[''].fillna(0)

수치형변수 스케일링은 랜포 쓴다는 가정에 생략

범주형변수 원핫인코딩

X_full = pd.get_dummies(X_full)

 

훈련, 테스트 데이터 다시 나누기 

X_train = X_full[:train.shape[0]]

X_test = X_full[train.shape[0]:]

 

이후 검증 데이터 나누는 것부터는 동일하다.