그라디언트 부스팅을 위한 추정기의 수를 선택하는 방법

데이터 사이언스에는 요즘 사용할 수 있는 알고리즘이 많이 있습니다. 따라서 한 가지 유용한 기술은 단일 모델에서 이들을 결합하여 각각을 최대한 활용하여 보다 정확한 모델을 만드는 것입니다.

Scikit-Learn을 사용하면 앙상블 모델의 배깅 유형인 Random Forest 알고리즘을 찾을 수 있습니다. 반면에 한 모델의 결과가 다음 모델로 전달되고 최적의 결과에 도달할 때까지 예측을 개선하려고 시도하는 추정기를 순서대로 훈련하는 부스팅 모델도 있습니다.

Gradient Boosting Estimator를 생성할 때 이 하이퍼파라미터를 찾을 수 있습니다. n_estimator=100 결과를 얻기 위해 생성될 100개의 나무의 기본값이 있습니다. 여러 번, 우리는 이것을 기본값으로 설정하거나 그리드 검색 기술을 사용하는 경우에도 필요에 따라 늘릴 수 있습니다.

이 게시물에서 우리는 모델을 훈련하는 데 사용할 단일 숫자에 도달하는 간단한 방법을 찾을 것입니다.

이 클래스를 사용하여 Scikit-Learn에서 Gradient Boosting을 로드할 수 있습니다. from sklearn.ensemble import GradientBoostingRegressor. Gradient Boosting 알고리즘은 분류 또는 회귀 모델에 사용할 수 있습니다. 이것은 트리 기반 추정기입니다. 즉, 많은 의사 결정 트리로 구성됩니다.

의 결과 트리 1 오류가 발생합니다. 이러한 오류가 사용되며 트리 2. 다시 한번, 마지막 모델의 오류가 사용되며 다음 모델의 입력이 도달할 때까지 n_estimators 값.

각 모델은 이전 모델의 오류에 맞을 것입니다. 저자의 이미지.

각 추정기는 이전 추정기의 오류에 맞을 것이기 때문에 예측 조합이 추정기 단독보다 더 나을 것으로 예상됩니다. 각 반복 후에 우리는 모델을 더 복잡하게 만들고 반대로 편향을 줄이지만 분산을 증가시킵니다. 그러므로 우리는 멈출 때를 알아야 합니다.

이제 어떻게 하는지 봅시다.

이 연습의 코드는 간단합니다. 우리가 해야 할 일은 각 반복 후에 루프를 만들고 어느 것이 가장 낮은 오류를 가졌는지 확인하는 것입니다.

데이터 세트를 선택하는 것으로 시작하겠습니다. 우리는 사용할 것입니다 자동차 충돌 Seaborn 라이브러리의 기본 데이터 세트(BDS 라이선스에 따른 공개 데이터).

# 데이터세트
df = sns.load_dataset('자동차 충돌')

데이터를 간단히 살펴보겠습니다. 우리는 추정하려고 할 것입니다 total 다른 특성을 예측 변수로 사용하는 양. 실수 출력이므로 회귀 모델에 대해 이야기하고 있습니다.

자동차 충돌 데이터 세트, 씨본에서. 저자의 이미지.

상관관계를 빠르게 살펴봅니다.

# 상관관계
df.corr().style.background_gradient(cmap='쿨웜')
데이터세트의 상관관계. 저자의 이미지.

네, 주요 다중공선성은 없습니다. 우리는 그것을 볼 수 있습니다 ins_premiumins_losses 와 잘 연관되지 않는다 total , 그래서 우리는 그것들을 모델에서 고려하지 않을 것입니다.

누락된 데이터를 확인하면 데이터가 없습니다.

# 없어진
df.isnull().sum()
0

좋습니다. 이제 데이터를 분할해 보겠습니다.

# X와 Y
X = df.drop(['ins_premium', 'ins_losses', '약어', '전체'], 축=1)
y = df['총계']
# 기차 테스트
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=22)

데이터를 확장하고 모델링하는 파이프라인을 생성할 수 있습니다(이 데이터는 이미 XNUMX진수로 동일한 규모에 있기 때문에 이 데이터를 확장할 필요가 없습니다.). 다음으로 데이터를 모델에 맞추고 결과를 예측합니다.

500개의 추정기를 사용하고 있습니다. learning_rate 0.3의.

학습률은 최소 오류에 도달하기 위해 취하는 단계의 크기입니다. 너무 높은 값을 사용하면 최소값을 전달할 수 있습니다. 너무 작은 숫자를 사용하면 근접하지 않을 수도 있습니다. 따라서 고려할 수 있는 경험 법칙은 추정기가 많은 경우 학습률의 낮은 값을 사용할 수 있다는 것입니다. 추정기가 몇 개인 경우 더 높은 학습률 값을 사용하는 것이 좋습니다.

단계 = [('규모', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03)) ]
# 인스턴스 파이프라인 및 적합성
파이프 = 파이프라인(단계).fit(X_train, y_train)
# 예측하다
preds = 파이프.예측(X_test)

이제 평가합니다.

# 예측의 RMSE
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[아웃]: RMSE: 1.1# 실제 Y 값의 평균
print(f'데이터 y 평균: {round( y.mean(),1 )}')
[OUT]: 데이터 y 평균: 15.8

좋은. RMSE는 평균의 약 6.9%입니다. 그래서 우리는 평균적으로 이 정도 차이가 납니다.

이제 가장 낮은 오류율을 제공하는 학습할 최적의 추정기 수를 선택하여 모델을 조정하는 방법을 확인하겠습니다.

내가 말했듯이, 이미 같은 비율에 있기 때문에 우리는 이 데이터를 실제로 확장할 필요가 없습니다. 그럼 모델을 맞추자.

#모델
gbr = GradientBoostingRegressor(n_estimators=500, learning_rate=0.3).fit(X_train, y_train)

이제 좋은 물건입니다. Gradient Boosting에는 1에서 500까지 훈련된 각 추정기의 예측을 반복할 수 있는 방법이 있습니다. 따라서 500개의 추정기를 통과하는 루프를 생성합니다. gbr 모델, 방법을 사용하여 결과 예측 staged_predict(), 평균 제곱 오차를 계산하고 결과를 목록에 저장합니다. errors.

# 최고의 숫자를 위한 루프
오류 = [ gbr.staged_predict(X_test)의 preds에 대한 mean_squared_error(y_test, preds)]
# 최적의 추정기 수
Optimal_num_estimators = np.argmin(오류) + 1

다음으로 결과를 플롯할 수 있습니다.

#구성
g=sns.lineplot(x=범위(500), y=오류)
g.set_title(f'{best_n_estimators}에서 최적의 추정기 수', 크기=15);
추정기의 최고 수. 저자의 이미지.

우리는 가장 낮은 오류율이 34개의 추정기를 사용한다는 것을 알 수 있습니다. 따라서 34개의 추정기로 모델을 다시 훈련시키고 파이프라인으로 훈련된 모델의 결과와 비교하겠습니다.

# 재교육
gbr = GradientBoostingRegressor(n_estimators=34, learning_rate=0.3).fit(X_train, y_train)
# 예측
preds2 = gbr.predict(X_test)

평가 중…

# 예측의 RMSE
print(f'RMSE: { 라운드(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[아웃]: RMSE: 1.0
# 데이터 Y 평균
print(f'데이터 y 평균: {round( y.mean(),1 )}')
[OUT]: 데이터 y 평균: 15.8

지금은 6.9%에서 6.3%로 떨어졌습니다. 약 9% 더 좋습니다. 몇 가지 예측을 살펴보겠습니다.

두 모델의 예측. 저자의 이미지.

흥미로운 결과. 두 번째 모델의 일부 예측은 첫 번째 모델보다 더 좋습니다.

우리는 조정할 최적의 추정기 수를 결정하는 방법을 배웠습니다. GradientBoostingRegressor Scikit-Learn에서. 이것은 추정기를 순차적으로 훈련시키는 이러한 종류의 앙상블 모델에서 차이를 만들 수 있는 하이퍼파라미터입니다.

때때로 몇 번의 반복 후에 모델이 과적합되기 시작할 수 있으므로 분산이 너무 많이 증가하기 시작하여 예측에 영향을 미칩니다.

우리는 간단한 루프가 이 경우 최적의 솔루션을 찾는 데 도움이 될 수 있음을 확인했습니다. 그러나 확실히 큰 데이터 세트의 경우 계산하는 데 비용이 많이 들 수 있으므로 아이디어는 더 낮은 값을 시도할 것입니다. n_estimators 처음에는 최소 오류에 충분히 빨리 도달할 수 있는지 확인하십시오.

여기에 GitHub의 전체 코드.

이 콘텐츠가 마음에 들면 내 블로그를 팔로우하세요.

나를 찾아 줘 링크드인.

이 연습은 참고 문헌에서 Aurélien Géron의 훌륭한 교과서를 기반으로 했습니다.

소스 https://towardsdatascience.com/how-to-choose-the-number-of-estimators-for-gradient-boosting-8d06920ab891?source=rss—-7f60cf5620c9에서 다시 게시된 Gradient Boosting에 대한 추정기 수를 선택하는 방법— 4 https://towardsdatascience.com/feed를 통해

<!–

–>

타임 스탬프 :

더보기 블록 체인 컨설턴트