df.drop(drop_cols, axis=1, inplace=True)
default는 axis=0
titanic.isna().sum() / len(titanic)*100
전체 데이터에서 결측치의 비율을 확인 후 시작!
범주형 값을 갖는 변수에 대한 One-Hot Encoding (get_dummies)
다중공선성 문제를 없애기 위해 drop_first=True 옵션 지정
- 오차 합: 모든 오차의 합을 더함, but 합이 0이 되는 경우가 생겨서 못씀
- 오차 제곱의 합:
- 오차 절대값의 합:
- 실제값은 y, 예측값은 hat-y
- SSE(그냥 합), MSE(Mean Sum Squared Error, 합의 평균), RMSE (MSE에 Root)를 사용
- 고객에게 얘기할만한건 RMSE뿐
- MAE(Mean Absolute Error), MAPE(퍼센트,n으로 나누기 전에 y로 먼저 나눔)
- STT: 전체 오차 (=허용된 전체 오차 범위,STT=SSE+SSR)
- SSR: 전체 오차 중 회귀식이 잡아낸 오차 (예측값-평균값)
- SSE: 전체 오차 중 회귀식이 잡아내지 못한 오타 (실제값-예측값)
SSE가 0이면 제일 좋고 SSR == SST면 제일 좋음
- 결정 계수 R-Squared
여기서 R은 Regression
가장 큰 값은 1 (클 수록 좋음)
우리 모델이 얼마나 설명을 잘 했는지 알려줌
cassification_report 사용하면 다 보임
데이터의 양이 어느정도 필요하고 성능이 어느정도 나오는지 확인하는 그래프
# 모듈 둘러오기
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import learning_curve
# 모셀선언
model = DecisionTreeClassifier(max_depth=3)
# Learning Curve 수행
tr_size, tr_scores, val_scores = learning_curve(model,
x,
y,
train_sizes=range(10, 7900, 20),
shuffle=True,
cv=5)
# CV 결과 --> 평균
val_scores_3_mean = val_scores.mean(axis=1)
# 시각화
plt.figure(figsize=(8, 5))
plt.plot(tr_size, val_scores_3_mean)
plt.title('Learning Curve', size=20, pad=15)
plt.ylabel('Score')
plt.xlabel('Training Size')
plt.show()
다른 변수가 또 다른 변수를 얼마나 설명하는지 확인
# 모듈 불러오기
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 빈 데이터프레임 만들기
vif = pd.DataFrame()
# VIF 확인 및 기록
vif['feature'] = x.columns
vif['vif_factor'] = [variance_inflation_factor(x.values, i) for i in range(x.shape[1])]
# VIF 기준으로 정렬렬
vif.sort_values(by='vif_factor', ascending=False, inplace=True)
vif.reset_index(drop=True, inplace=True)
# 확인
vif
선형회귀는 x값이 많을수록 과한 복잡성이 생김 > 성능 down
ridge, rasso 등으로 해결할 가능성이 있다.
1.Ridge
# 모델링(Ridge CV)
from sklearn.linear_model import RidgeCV
alpha = np.linspace(0.1, 30, 20)
model = RidgeCV(alphas=alpha, cv=5)
model.fit(x_train, y_train)
# 성능 확인
print('학습성능:', model.score(x_train, y_train))
print('평가성능:', model.score(x_test, y_test))
print('-' * 28)
print('alpha:', model.alpha_)
# 모델링(LassoCV)
from sklearn.linear_model import LassoCV
alpha = np.linspace(0.1, 10, 50)
model = LassoCV(alphas=alpha, cv=5, random_state=1)
model.fit(x_train, y_train)
# 성능 확인
print('학습성능:', model.score(x_train, y_train))
print('평가성능:', model.score(x_test, y_test))
print('-' * 28)
print('alpha:', model.alpha_)
# 모델링(ElasticNetCV)
from sklearn.linear_model import ElasticNetCV
l1 = np.linspace(0.1, 1, 10)
alpha = np.linspace(0.1, 10, 50)
model = ElasticNetCV(l1_ratio=l1, alphas=alpha, cv=5, random_state=1)
model.fit(x_train, y_train)
# 성능 확인
print('학습성능:', model.score(x_train, y_train))
print('평가성능:', model.score(x_test, y_test))
print('-' * 28)
print('l1_ratio:', model.l1_ratio_)
print('alpha:', model.alpha_)
별에서 원까지 거리 구할 때의 두 가지 방식
밑은 변수 중요도 시각화 코드
plt.figure(figsize=(5, 5))
plt.barh(list(x), model.feature_importances_)
plt.show()
밑은 중요도를 정렬해서 시각화
# 데이터프레임 만들기
perf_dic = {'feature':list(x), 'importance': model.feature_importances_}
df = pd.DataFrame(perf_dic)
df.sort_values(by='importance', ascending=True, inplace=True)
# 시각화
plt.figure(figsize=(5, 5))
plt.barh(df['feature'], df['importance'])
plt.show()
배깅 (Bagging)
다르게 샘플링(복원추출)된 데이터셋과 같은 알고리즘을 사용
범주형은 voting, 연속형은 평균으로 결과 집계 (aggregating)
ex) 랜덤 포레스트
부스팅 (Boosting)
오류를 예측하는 모델을 만들어서 반영 (gradient boost)
어디에서 멈출지 파라미터 튜닝해야함
스태킹 (Stacking)
raw데이터를 가지고 모델들이 예측한 값을 input으로 받는 최종 모델을 만들어 결과를 예측