[4일차] 컴백 평가를 해보도록 하겠습니다. [2021 추가 달력]
2021년 1인 특정 달력(기계학습)은 나흘째 보도다.
주제는 회귀의 정밀도 평가다.
MAE, MSE, RMMSE, R2점 처리.
Colab의 코드는 여기.입니다.
MAE, MSE, RMMSE, R2점의 실현
RMSE를 LightGBM의 메트릭으로 설정합니다.
(이론적 내용은 잠시 후)
params = {
'task': 'train', # タスクを訓練に設定
'boosting_type': 'gbdt', # GBDTを指定
'objective': 'regression', # 回帰を指定
'metric': 'rmse', # 回帰の損失(誤差)
'learning_rate': 0.1, # 学習率
}
lgb_results = {} # 学習の履歴を入れる入物
model = lgb.train(
params=params, # ハイパーパラメータをセット
train_set=lgb_train, # 訓練データを訓練用にセット
valid_sets=[lgb_train, lgb_test], # 訓練データとテストデータをセット
valid_names=['Train', 'Test'], # データセットの名前をそれぞれ設定
num_boost_round=100, # 計算回数
early_stopping_rounds=50, # アーリーストッピング設定
evals_result=lgb_results,
verbose_eval=-1, # ログを最後の1つだけ表示
)
정밀도 평가용 라이브러리를 사용하면 편리합니다.외관을 정리하기 위해 라운드를 사용했지만 안 써도 돼요.
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
from sklearn.metrics import explained_variance_score
from sklearn.metrics import max_error
from sklearn.metrics import median_absolute_error
mae = mean_absolute_error(y_test, y_pred)
print("MAE:", round(mae, 4))
mse = mean_squared_error(y_test, y_pred)
print("MSE:", round(mse, 4))
rmse1 = np.sqrt(mean_squared_error(y_test, y_pred))
print("RMSE 1:", round(rmse1, 4))
rmse2 = mean_squared_error(y_test, y_pred, squared=False)
print("RMSE 2:", round(rmse2, 4))
r2score = r2_score(y_test, y_pred)
print("R2 score:", round(r2score, 4))
다음은 MAE로 측정해 보자.(상술한 바와 같이 이론 내용은 잠시 후에 언급될 것이다)
params = {
'task': 'train', # タスクを訓練に設定
'boosting_type': 'gbdt', # GBDTを指定
'objective': 'regression', # 回帰分類を指定
'metric': 'mae', # 回帰の損失(誤差)
'learning_rate': 0.1, # 学習率
}
출력은 다음과 같다.미묘한 차이지만 도량으로 설정된 지표의 정밀도가 더 높다는 것을 알 수 있다.
나는 이것이 각자의 지표가 어떤 데이터의 영향을 받기 쉬운지 나타낸다고 생각한다.
출력:
지표
metric:rmse
metric:mae
MAE:
0.0183
0.0182
MSE:
0.0601
0.0604
RMSE 1:
0.2452
0.2457
RMSE 2:
0.2452
0.2457
R2 score:
0.9205
0.9202
이론
그럼 각자의 평가 지표를 살펴봅시다.
MAE 평균 절대 오차
예측치와 정해치의 차이(=오차)의 절대치의 합을 데이터수로 나눈 값
\begin{aligned}
MAE =\frac{1}{n}\sum_{i=1}^n|y^i -\hat{y}^i|
\end{aligned}
MSE 균일 오차
예측치와 정해치의 차이(=오차)의 제곱값을 계산하고 이를 합쳐서 데이터수로 나눈 값
\begin{aligned}
MSE =\frac{1}{n}\sum_{i=1}^n(y^i -\hat{y}^i)^{2}
\end{aligned}
RMMSE 평균 제곱 오차
예측치와 정해치의 차이(=오차)의 제곱치의 총계는 제곱근이다.
\begin{aligned}
RMSE =\sqrt{\frac{1}{n}\sum_{i=1}^n(y^i -\hat{y}^i)^{2}}
\end{aligned}
$R^{2}$결정 계수
\begin{aligned}
R^{2} = 1 -\frac{\sum_{i=1}^n(y^i -\hat{y}^i)^{2}}{\sum_{i=1}^n(y^i -\bar{y}^i)^{2}}
\end{aligned}
극단적 예
이해하기 편리하도록 극단적인 예를 써서 각 지표를 살펴보자.
(사용 빈도가 높은 MAE, MSE, RMMSE R2 점수 기준)
print("MAE:", mean_absolute_error(true, pred))
print("MSE:", mean_squared_error(true, pred))
print("RMSE:", mean_squared_error(true, pred, squared=False))
print("R2 score:", r2_score(true, pred))
모델1 오차가 크고 작으며 예측은 실제 상황과 무관하다true = [100, 2]
pred = [1, 1]
실질 성적예측
에러
100
1
99
2
1
1
패턴2 오차가 크고 예측은 실제치와 무관하다
true = [100, 99]
pred = [1, 1]
실질 성적예측
에러
100
1
99
99
1
98
지표
가치 평가 1
가치 평가 2
MAE:
50.0
98.5
MSE:
4901.0
9702.5
RMSE:
70.00714249274856
98.501..
R2 score:
-1.0412328196584757
-38809.0
제 개인적인 의견이지만 다음과 같이 기본적으로 이해하면 좋을 것 같습니다.
(1) 제곱과 (2) 절대치를 사용하여 오차가 마이너스로 변할 때의 영향을 제거하는 방법으로 한다.
(1) 제곱을 사용해 오차의 부정적인 영향을 없애면 수치가 지수 증가를 보이기 때문에 오차가 큰 영향을 받기 쉽다.
따라서 큰 오차의 발생을 억제할 수 있지만 편차치의 영향을 받기 쉽다.
(2) 절대값을 사용하는 경우 제곱을 사용하는 경우보다 오차가 큰 경우의 영향을 더 받기 어렵다.
따라서 제곱을 사용하는 경우와 비교하면 큰 오차의 발생을 억제하기 어려우면서도 편차치의 영향을 받기 어렵다.
MAE는 절대값을 사용하여 오차의 부정적인 영향을 제거합니다.
MSE 및 RMMSE는 제곱을 사용하여 오차의 부정적 영향을 제거합니다.
한편, R2 득점은 상관관계에 영향을 받았다.
R2득점은 1에서 [차의 제곱을 합한 합계와 실제 성적과 실제 평균치의 차이를 합한 합계]이다.
예측과 실제 성적의 오차, 개별 실적과 실제 성과의 평균치의 배리 영향.
개별 실적과 실제 성과의 평균치의 괴리 없이 분포가 안정되면 분모가 작아진다.예측도 쉬울 것 같은데?
그럼에도 일정 부분 예측과 실제 성적 오차가 발생하면 R2점이 감점되기도 한다.
또 이때 실제 성적의 추이와 예측의 추이가 상관이 없을수록 R2점의 감소 폭이 커진다.
R2점 추가
R2점에 관해서는 좀 더 보충해 주세요.
패턴1은 큰 오차와 작은 오차가 있어 실제 상황과 무관하게 예측한다
true = [100, 2]
pred = [1, 1]
print("実績: ", true)
print("予測: ", pred)
print("実績の平均: ", np.array([np.mean(true)] * len(true)).tolist() )
print()
a = np.sum(
(
# 実績
np.array(true) - \
# 予測
np.array(pred)
)
** 2)
print("実績と予測の差(誤差)の総和の二乗: ", a) # 分子
b = np.sum(
(
# 実績
np.array(true) \
# 実績の平均値
- np.array([np.mean(true)] * len(true))
)
** 2 )
print("実績と実績の平均値の差の総和の二乗: ", b) # 分母
score = 1 - a/b # R2 score
print("R2 Score: ", score)
R2는 마이너스를 기록했다.출력:
실제 성적:[10,2]
예측: [1,1]
실제 성과 평균: [51.051.0]
실제 성적과 예측의 차이(오차)의 제곱:9802
실제 성적과 실제 성적의 평균치의 차이의 제곱: 4802.0
R2 Score: -1.0412328196584757
패턴2 오차가 크고 예측은 실제치와 무관하다
true = [100, 99]
pred = [1, 1]
### 以降、パターン1と同様
R2점의 감소폭이 놀랍다.출력:
실제 성적: [10099]
예측: [1,1]
실제 성과 평균: [99.599.5]
실적과 예측의 차이(오차)의 제곱: 19405
실제 값과 실제 값의 평균 값의 차이의 제곱: 0.5
R2 Score: -38809.0
패턴 3 오차가 적고 예측과 실제값과 관련이 있다
true = [1.5, 1.2]
pred = [1.4, 1.1]
### 以降、パターン1と同様
R2의 득점은 마침내 가산점의 좋은 정밀도를 얻었다.출력:
실제 성과: [11.5,1.2]
예측: [11.41.1]
실제 성과 평균: [1.351.35]
실적과 예측의 차이(오차)의 합계: 0.0199999999999
실제 성적과 실제 성적의 평균치의 차이의 제곱: 0.04500001
R2 Score: 0.5555555555555559
패턴 4 오차는 작지만 예측과 실제 상황은 무관하다
true = [1.5, 1.2]
pred = [1.0, 1.0]
### 以降、パターン1と同様
패턴 3과 오차 크기에 큰 변화가 없지만 예측된 관련성 분실로 R2 득점은 마이너스로 바뀌었다.출력:
실제 성과: [11.5,1.2]
예측: [1.01.0]
실제 성과 평균: [1.351.35]
실제 성적과 예측의 차이(오차)의 제곱:0.29
실제 성적과 실제 성적의 평균치의 차이의 제곱: 0.04500001
R2 Score: -5.444444444444442
비교는 다음과 같다.
패턴
개요
R2분
모드 1
오차가 각기 다르기 때문에 예측은 실제 성적과 상관이 없다
-1.04
모드 2
오차가 커서 예측은 실제 성적과 무관하다
-38809.0
모드 3
오차도 적고 예측과 실제 성적과 관련이 있다
0.55
모드 4
오차는 비록 작지만 예측과 실제 성적은 무관하다
-5.44
넷째 날은 여기까지입니다. 끝까지 읽어주셔서 감사합니다.
사이트 축소판 그림
Reference
이 문제에 관하여([4일차] 컴백 평가를 해보도록 하겠습니다. [2021 추가 달력]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/megane_otoko/articles/2021ad_04_evaluation텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)