Keras 101 : 주택 가격 회귀를위한 단순하고 해석 가능한 신경망 모델

요약 : 신경망과 함께 Boston 데이터 세트를 사용하고 SHAP 값을 채택하여 모델을 설명하는 주택 가격을 예측합니다. 전체 노트북은 여기 에서 찾을 수 있습니다 .

이 게시물에서는 보스턴 (MA) 지역에서 특정 주택의 판매 가격을 예측하는 데 도움이되도록 Keras로 모델을 구축하고 데이터 탐색의 몇 가지 기본 사항을 다룰 것입니다. 현실 세계에서이 모델을 적용 할 때, 일상 업무에 도움이되는 도구를 찾는 실제 주정부 요원이되는 것에 대해 생각할 수 있습니다. 직감 추정.

이 연습에서는 데이터를 이해하는 데 확실히 도움이되는 대화 형 플롯이 더 많기 때문에 기존의 matplotlib 대신 Plotly 라이브러리를 사용합니다 . 우리는 또한 사용 Scikit이-알아보기Keras , 모델 구축을위한 팬더의 우리의 데이터와 조작 라이브러리를 SHAP 라이브러리 우리의 교육 모델에 대한 설명을 생성 할 수 있습니다.

데이터 세트 가져 오기

이 예에서는 Boston 데이터 세트가 포함 된 sklearn.datasets 모듈을 사용합니다. keras.datasets 모듈을 사용할 수도 있지만이 모듈에는 기능의 레이블이 포함되어 있지 않으므로 scikit 모듈을 사용하기로 결정했습니다. 또한이를 Pandas DataFrame으로 변환하고 머리를 인쇄 해 보겠습니다.

from sklearn.datasets import load_boston
import pandas as pd
boston_dataset = load_boston()
df = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
df['MEDV'] = boston_dataset.target
df.head(n=10)

데이터 세트를 편안하고 익숙하게 만드는 것은 데이터를 이해하고 결과에서 더 나은 결론과 설명을 도출하는 데 도움이되는 기본적인 단계입니다.

먼저, 데이터 분포에서 이상 값 및 / 또는 이상 값을 더 잘 시각화하는 데 도움이되는 몇 가지 상자 그림을 플로팅 해 보겠습니다. 박스 플롯이 무엇이며 데이터 분포를 더 잘 시각화하는 데 어떻게 도움이 될 수 있는지에 대해 혼란 스러우면 Ross (1977)의 간략한 설명이 있습니다.

기술 통계에서 상자 그림은 사 분위수를 통해 숫자 데이터 그룹을 그래픽으로 묘사하는 방법입니다. 상자 플롯에는 상위 및 하위 사 분위수 외부의 변동성을 나타내는 상자 (수염)에서 수직으로 확장되는 선이있을 수 있으므로 상자-수염 플롯과 상자-수염 다이어그램이라는 용어가 사용됩니다. 특이 치는 개별 포인트로 표시 될 수 있습니다.

from plotly.subplots import make_subplots
import plotly.graph_objects as go
import math
total_items = len(df.columns)
items_per_row = 3
total_rows = math.ceil(total_items / items_per_row)
fig = make_subplots(rows=total_rows, cols=items_per_row)
cur_row = 1
cur_col = 1
for index, column in enumerate(df.columns):
    fig.add_trace(go.Box(y=df[column], name=column), row=cur_row, col=cur_col)
    
    if cur_col % items_per_row == 0:
        cur_col = 1
        cur_row = cur_row + 1
    else:
        cur_col = cur_col + 1

fig.update_layout(height=1000, width=550,  showlegend=False)
fig.show()

이러한 결과는 일부 열에 특이 치를 갖는 것에 대한 초기 가정을 확증합니다. 또한 각 특성 및 대상 변수와 해당 절편 선에 대한 산점도를 플로팅 해 보겠습니다.

from plotly.subplots import make_subplots
import plotly.graph_objects as go
import math
import numpy as np
total_items = len(df.columns)
items_per_row = 3
total_rows = math.ceil(total_items / items_per_row)
fig = make_subplots(rows=total_rows, cols=items_per_row, subplot_titles=df.columns)
cur_row = 1
cur_col = 1
for index, column in enumerate(df.columns):
    fig.add_trace(go.Scattergl(x=df[column], 
                            y=df['MEDV'], 
                            mode="markers", 
                            marker=dict(size=3)), 
                  row=cur_row, 
                  col=cur_col)
    
    intercept = np.poly1d(np.polyfit(df[column], df['MEDV'], 1))(np.unique(df[column]))
    
    fig.add_trace(go.Scatter(x=np.unique(df[column]), 
                             y=intercept, 
                             line=dict(color='red', width=1)), 
                  row=cur_row, 
                  col=cur_col)
    
    if cur_col % items_per_row == 0:
        cur_col = 1
        cur_row = cur_row + 1
    else:
        cur_col = cur_col + 1

fig.update_layout(height=1000, width=550, showlegend=False)
fig.show()
  • RM (거주 당 평균 방 수)과 LSTAT (인구의 낮은 상태 %) 간에는 RM이 양수이고 LSTAT가 음의 상관 관계인 목표 변수 사이에는 강한 선형 상관 관계가 있습니다.
  • 더 많은 정규화 된 데이터로 모델을 입력하기 위해 전처리 할 수있는 특이 치를 포함하는 일부 레코드가 있습니다.

데이터 사전 처리를 진행하기 전에 데이터를 학습 및 테스트 세트로 분할하는 것이 중요합니다. 우리는 테스트 세트의 정보를 다른 세트로 유출해서는 안된다는 것을 염두에 두지 않고 데이터에 어떤 종류의 전처리도 적용해서는 안됩니다. 이 단계에서는 scikit-learn 의 train_test_split 메서드를 사용할 수 있습니다 . 이 경우 데이터의 70 %를 학습용으로 분할하고 30 %를 테스트 용으로 사용합니다. 메서드 재현성을 허용하기 위해 random_state 시드도 설정했습니다.

from sklearn.model_selection import train_test_split
X = df.loc[:, df.columns != 'MEDV']
y = df.loc[:, df.columns == 'MEDV']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123)

mean = X_train.mean(axis=0)
std = X_train.std(axis=0)
X_train = (X_train - mean) / std
X_test = (X_test - mean) / std

이 데이터 세트에 제시된 데이터의 양이 적기 때문에 지나치게 복잡한 모델을 생성하지 않도록주의해야합니다. 이로 인해 데이터가 과적 합 될 수 있습니다. 이를 위해 우리는 ReLU (Rectified Linear Unit) 활성화 함수를 사용하는 두 개의 Dense 레이어 (첫 번째는 128 개, 두 번째는 뉴런이 64 개)를 기반으로하는 아키텍처를 채택 할 것입니다. 선형 활성화가있는 조밀 한 레이어가 출력 레이어로 사용됩니다.

모델이 제대로 학습되고 있는지 알 수 있도록 평균 제곱 오류 손실 함수를 사용하고 성능을보고하기 위해 평균 평균 오류 메트릭을 채택합니다.

Keras의 요약 방법을 사용하면 총 10,113 개의 매개 변수가 있음을 알 수 있습니다.

from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(128, input_shape=(13, ), activation='relu', name='dense_1'))
model.add(Dense(64, activation='relu', name='dense_2'))
model.add(Dense(1, activation='linear', name='dense_output'))
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
model.summary()

이 단계는 매우 간단합니다. 총 100 epoch에 대해 기능과 레이블을 모두 사용하여 모델을 맞추고 샘플의 5 % (18 개 레코드)를 검증 세트로 분리합니다.

history = model.fit(X_train, y_train, epochs=100, validation_split=0.05)

fig = go.Figure()
fig.add_trace(go.Scattergl(y=history.history['loss'],
                    name='Train'))
fig.add_trace(go.Scattergl(y=history.history['val_loss'],
                    name='Valid'))

fig.update_layout(height=500, width=700,
                  xaxis_title='Epoch',
                  yaxis_title='Loss')
fig.show()
Train and validation losses for our trained model. We can see that our model was clearly capable of learning the patterns on our data without the presence of data overfitting.
fig = go.Figure() fig.add_trace(go.Scattergl(y=history.history['mean_absolute_error'], name='Train')) fig.add_trace(go.Scattergl(y=history.history['val_mean_absolute_error'], name='Valid')) fig.update_layout(height=500, width=700, xaxis_title='Epoch', yaxis_title='Mean Absolute Error') fig.show()
Train and validation Mean Absolute Error (MAE) for both training and validation sets.

모델이 실제 시나리오에서 작동 할 수 있는지 제대로 평가하려면 테스트 세트를 사용하여 평가해야합니다. 아래에서는 테스트 세트의 기능 및 대상과 함께 평가 방법을 사용합니다.

mse_nn, mae_nn = model.evaluate(X_test, y_test)
print('Mean squared error on test data: ', mse_nn)
print('Mean absolute error on test data: ', mae_nn)

152/152 [==============================] - 0s 60us/step
Mean squared error on test data:  17.429732523466413
Mean absolute error on test data:  2.6727954964888725

먼저 간단한 알고리즘 인 선형 회귀를 사용해 보겠습니다.

lr_model = LinearRegression()
lr_model.fit(X_train, y_train)
y_pred_lr = lr_model.predict(X_test)
mse_lr = mean_squared_error(y_test, y_pred_lr)
mae_lr = mean_absolute_error(y_test, y_pred_lr)
print('Mean squared error on test data: ', mse_lr)
print('Mean absolute error on test data: ', mae_lr)
Mean squared error on test data: 28.40585481050824
Mean absolute error on test data: 3.6913626771162575

tree = DecisionTreeRegressor()
tree.fit(X_train, y_train)
y_pred_tree = tree.predict(X_test)
mse_dt = mean_squared_error(y_test, y_pred_tree)
mae_dt = mean_absolute_error(y_test, y_pred_tree)
print('Mean squared error on test data: ', mse_dt)
print('Mean absolute error on test data: ', mae_dt)
Mean squared error on test data:  17.830657894736845
Mean absolute error on test data:  2.755263157894737

때로는 좋은 결과만으로도 대부분의 사람들에게 충분하지만 예측을 수행하기 위해 모델에서 사용하는 주요 구성 요소를 설명해야하는 시나리오가 있습니다. 이 작업을 위해 SHAP 라이브러리를 사용하면 기능 요약과 모델 출력에 미치는 영향을 쉽게 작성할 수 있습니다. SHAP에 대해 자세히 살펴 보지는 않겠지 만 작동 방식에 대해 더 자세히 알고 싶다면 github 페이지를 확인 하거나 해당 문서를 살펴볼 수도 있습니다.

import shap
shap.initjs()
explainer = shap.DeepExplainer(model, X_train[:100].values)
shap_values = explainer.shap_values(X_test[:100].values)
shap.summary_plot(shap_values, X_test, plot_type='bar')
  • LSTAT : 인구의 낮은 지위 %
  • RM : 주거 당 평균 방 수
  • RAD : 방사형 고속도로 접근성 지수
  • DIS : 보스턴 고용 센터 5 곳까지의 가중 거리
  • NOX : 산화 질소 농도 (1,000 만분 율) —이 지역의 녹지와 관련이있을 가능성이 높습니다.
  • CRIM : 도시 별 1 인당 범죄율

결론

이 게시물에서 우리는 신경망을 사용하여 기존의 기계 학습 방법을 쉽게 능가 할 수 있음을 보여주었습니다. 또한 더 복잡한 모델을 사용하는 경우에도 다른 기술과 비교할 때 SHAP 값을 사용하여 모델의 결과를 설명 할 수 있음을 보여줍니다.

또한 탐색 된 데이터 세트가 다소 구식 일 수 있으며 현재 시나리오를 더 잘 반영하기 위해 일부 기능 엔지니어링 (예 : 인플레이션 가격 수정)을 수행 할 수 있다는 점을 염두에 두어야합니다.

참고 문헌

보스턴 데이터 세트 : https://www.cs.toronto.edu/~delve/data/boston/bostonDetail.html

줄거리 : https://plot.ly/python/

ScikitLearn : https://scikit-learn.org/stable/

케 라스 : https://keras.io/

판다 : https://pandas.pydata.org/

SHAP 프로젝트 페이지 : https://github.com/slundberg/shap

SHAP 용지 : https://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions.pdf

엔지니어와 과학자를위한 확률 및 통계 소개. https://www.amazon.com.br/dp/B007ZBZN9U/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

Suggested posts

베이지안 확산 모델링을 사용한 고급 예측

베이지안 확산 모델링을 사용한 고급 예측

데이터 과학의 모든 영역에서 동적 현상을 예측하고 설명하기위한 혁신적인 모델링 솔루션에 대한 수요가 많습니다. 모델링 및 동적 현상 예측의 높은 프로필 사용 사례는 다음과 같습니다. 오픈 소스 데이터 세트에 적용된 베이지안 확산 모델링을 보여주는 종단 간 예제가 제공됩니다.

비용이 많이 드는 앱은 무료 앱보다 높은 평가를 받습니까?

비용이 많이 드는 앱은 무료 앱보다 높은 평가를 받습니까?

애플리케이션의 평균 사용자 평점은 사용자가 앱을 즐기는 지 여부와 앱의 성공 수준을 결정하는 데 도움이되는 훌륭한 지표입니다. 사용자가 응용 프로그램을 구입해야하는 경우 응용 프로그램에 대한 표준이 무료 응용 프로그램에 비해 높습니다.

Related posts

Spotify의 마법 성분 : 기계 학습

Spotify의 마법 성분 : 기계 학습

면책 조항 :이 기사는 Spotify와 관련이 없으며 Spotify 및 현재 관련이 없을 수있는 과거 구조에 대한 확인되지 않은 정보로 구성 될 수 있습니다. 음악은 표현의 한 형태, 예술의 형태, 전체적인 문화 활동입니다.

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

신경 과학에서 자동 분화, 신경망 이론 및 신경 과정의 과소 적합에 이르기까지 현재 추구되고있는 다양한 딥 러닝 연구 흐름에 대한 더 나은 개요를 얻고 싶으십니까? 합리적으로 통과하기에는 열려있는 arXiv 탭이 너무 많습니까? 전체 동영상을 볼 시간이 너무 적습니까? 논문의 핵심 아이디어와 개념에 대한 간략한 요약 만 있다면. 그런 다음 '머신-러닝-콜라주'시리즈를 소개하게되어 기쁩니다.

내부의 관심 네트워크 그래프

수학에서 NumPy까지 단계별 가이드

내부의 관심 네트워크 그래프

그래프 신경망 (GNN)은 그래프 데이터에서 학습 할 수있는 표준 도구 상자로 등장했습니다. GNN은 콘텐츠 추천 또는 신약 발견과 같은 다양한 분야에서 영향이 큰 문제를 개선 할 수 있습니다.

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

안녕하세요! 이미지 분할에 대한이 짧은 시리즈의 첫 번째 부분을 읽지 않았다면 여기에서 읽으십시오. 이전 이야기에서 임계 값 및 색상 분할에 대해 논의 했으므로 2 부에서는 색도 분할과 이미지 차이에 중점을 둘 것입니다.