Q. year-month-code를 넣으니 피처 중요도는 높다고 나오는데 성능 자체가 떨어졌으면 쓸만한 피처가 아니라는 건가요
A. 해당 모델이 학습을 할 때 중요한 역할을 했다고 알려주지만 피처 중요도가 모델의 성능을 설명하지는 않습니다. 모델의 성능은 모의고사를 보는 과정과 유사한 cross validation 점수가 올라갔는지 내려갔는지를 확인해 봅니다. (스코어 측정 방법에 따라 점수가 올라가야지 좋은 성능을 낸다고 판다하는 측정지표도 있고 내려가야 좋은 측정지표도 있으니 구분해서 보세요.)
점수가 높아야 좋은 지표 : Accuracy, r2 score
점수가 낮아야 좋은 지표 : MAE, MSE, RMSE, RMSLE
log(1 + x) 1을 더해준 로그Q. 왜 정규분포가 되면 머신러닝이나 딥러닝에서 좋은 성능을 낼까요?
A. 값을 볼 때 한쪽에 너무 치우쳐져 있고 뾰족하다면 특성을 제대로 학습하기가 어렵기 때문에 정규분포로 되어 있다면 특성을 고르게 학습할 수 있다.
np.log(y) : log_e y = x
np.exp(x) : e^x = y
# 로그 취한것
train["count_log1p"] = np.log(train["count"] + 1)
# 지수함수로 로그 해제
np.exp(train["count_log1p"]) - 1
# 둘이 값이 같다!!
train["count"] == np.exp(train["count_log1p"]) - 1
-1을 해줘야 하는 이유# 이를 x 라하자
x = `log_e ('count' + 1)` == np.log(train["count"] + 1)
exp(x) = e^x = 'count' + 1
'count' = exp(x) - 1 = np.exp(train["count_log1p"]) - 1
from sklearn.model_selection import RandomizedSearchCV
param_distributions = {"max_depth": np.random.randint(3, 10, 10),
"max_features": np.random.uniform(0, 1, 10)}
reg = RandomizedSearchCV(model,
param_distributions=param_distributions,
scoring="neg_root_mean_squared_error",
n_iter=10, cv=5, n_jobs=-1,
verbose=2, random_state=42)
reg.fit(X_train, y_train)
reg.best_estimator_
# neg_root_mean_squared_error 로 되어 있어서 스코어가 음수로 나온다.
rmsle = abs(reg.best_score_)
rmsle
위에서 구한 reg.bestestimator 로 cross_val_predict 를 해야 점수를 직접 구해볼 수 있다.
위에서 이미 RMSLE 점수를 구해봤기 때문에 굳이 점수를 따로 구해보지 않아도 되지만,
만약, 사이킷런에서 제공하고 있지 않은 측정 지표로 측정을 해야 한다면 직접 cross_val_predict 값을 구해서 측정해 볼 수도 있다.
train_null = train.isnull().sum()
train_null_sum = train_null[train_null != 0].sort_values(ascending=False)
train_null_mean = train.isnull().mean()
pd.concat([train_null,train_null_mean], axis=1).loc[train_null_sum.index]
_ = sns.scatterplot(data=train, x=train.index, y="SalePrice")
plt.axhline(500000, c="k", ls=":")
- color or c: color
- linestyle or ls: {'-', '--', '-.', ':', '', (offset, on-off-seq), ...}
train 의 이상치는 제거하면 되는데, test의 이상치는 제거 할 수 없다.
그럴때 어떻게 예측을 하는게 좋을까??
-> 분할해서 예측한다. 스케일링을 해준다.
# 범주형데이터에서, unique 종류가 많은 상위 10개 추출해보기
train.select_dtypes(include="object").nunique().nlargest(10)