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]:]
이후 검증 데이터 나누는 것부터는 동일하다.