# 0. 데이터 불러오기
train = pd.read_csv('train.csv')
test= pd.read_csv('test.csv')
# 1. 데이터 확인하기
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier # ☆분류
from sklearn.ensemble import RandomForestRegressor # ★회귀
from sklearn.metrics import f1_score, accuracy_score, roc_auc_score # ☆분류
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error # ★회귀
print(train) # 변수 및 데이터 확인
print(test)
print(train.info()) # 범주형 변수 확인
print(test.info())
print(train.isnull().sum()) # 결측치 확인
print(test.isnull().sum())
# 2. 데이터 전처리 - train, test 둘 다 처리! (→ But, 보통 결측치 없는 데이터로 출제됨)
train['A'] = train['A'].fillna(train['A'].mean()) # 평균 대체
test['A'] = test['A'].fillna(test['A'].mean())
train['A'] = train['A'].fillna(train['A'].mode()[0]) # 최빈값 대체
train['A'] = train['A'].fillna(0) # 0으로 대체
train['A'] = train['A'].fillna(method='bfill') # 뒤 값으로 대체
train = train.dropna() # 전체 결측치 데이터 삭제
train = train.dropna(subset=['A', 'B']) # 특정컬럼의 결측치 데이터 삭제
train = train.dropna(axis=1) # 결측치 있는 컬럼 삭제
# 3. 불필요한 데이터 삭제
test_id = test['ID'] # ID를 최종 제출파일에 포함하여야 하는 경우에 실행
y = train['price'] # 예측 대상
train = train.drop(['ID', 'name'], axis=1) # 데이터와 관련 없는 변수 작성
test = test.drop(['ID', 'name'], axis=1)
# 4. 원핫인코딩
df = pd.concat([train, test]) # 합치기
df = pd.get_dummies(df, columns=['A', 'B']) # 범주형 변수 모두 작성 / 더미변환
train = df.iloc[:len(train),:].copy() # 다시 분리
test = df.iloc[len(train):,:].copy()
# 5. 검증데이터 분리
x_tr, x_val, y_tr, y_val = train_test_split(train, y, test_size=0.2, random_state=42)
# 6. 모델 학습 및 평가 (랜덤포레스트)
rf = RandomForestClassifier(random_state=42) # ☆분류
rf = RandomForestRegressor(random_state=42) # ★회귀
rf.fit(x_tr, y_tr)
# ☆7-1. 분류모델 평가 및 예측 - 1) 정확도, 직접예측 (사용자 수 등)
pred = rf.predict(x_val)
print(f1_score(y_val, pred)) # 다중분류는 (y_val, pred, average='macro') 작성
print(accuracy_score(y_val, pred))
pred = rf.predict(test)
pd.DataFrame({'ID':test_id, 'pred':pred}).to_csv('result.csv', index=False) # 제출해야 하는 변수명으로 작성
# ☆7-1. 분류모델 평가 및 예측 - 2) auc, 확률
pred_proba = rf.predict_proba(x_val)[:,1]
print(roc_auc_score(y_val, pred_proba))
pred_proba = rf.predict_proba(test)[:,1]
pd.DataFrame({'Id':test_id, 'pred':pred_proba}).to_csv('result.csv', index=False)
# ★7-2. 회귀모델 평가 및 예측
pred = rf.predict(x_val)
print("r2: ",r2_score(y_val, pred)) # R-squared (1에 가까울수록 좋음)
print("mae: ",mean_absolute_error(y_val, pred)) # MAE
print("mse: ",mean_squared_error(y_val, pred)) # MSE
print("rmse: ",np.sqrt(mean_squared_error(y_val, pred))) # RMSE (자주 출제됨)
pred = rf.predict(test)
pd.DataFrame({'ID':test_id, 'pred':pred}).to_csv("result.csv", index=False)
# 8. 결과 확인
print(len(pred), len(test_id)) # 동일해야 함
result = pd.read_csv('result.csv') # 예시 형태로 나오는지 확인
print(result)