| 스피커 |
성적 증명서 |
| 루카스 |
네, 제 강연에 참석해 주셔서 감사합니다. 저는 루카스 베벌린입니다. 인텔에서 통계학을 공부하고 있습니다. |
| |
오늘은 JMP를 사용하여 다양한 환경의 모델을 비교하는 방법에 대해 이야기해보겠습니다. |
| |
알겠습니다. 현재 JMP 15 Pro는 JMP에서 출시된 가장 최신이자 가장 뛰어난 제품입니다. 모델을 맞추고 싶다면 여러 가지 도구가 있습니다. |
| |
적합 모델 플랫폼이 있고, 신경망 분할 플랫폼에 대한 신경 플랫폼이 있습니다. 분류 및 회귀 트리가 필요한 경우, 비선형 모델링을 위한 비선형 플랫폼 등이 있습니다. 그 외에도 여러 플랫폼이 있습니다. |
| |
그래서 JMP 15에서는 12년이나 13년에 나왔던 것 같은데 이 모델 비교 플랫폼은 비교하는 데 사용할 수 있는 아주 편리한 도구입니다. |
| |
JMP 내에서 다양한 플랫폼의 모델을 적합할 수 있습니다. 예를 들어 트리와 신경망이 있는데 어떤 것이 더 나은지 잘 모르겠다면, 두 가지를 번갈아 사용할 수 있습니다. 하지만 이제 이 기능을 사용하면 |
| |
모든 것을 한 화면에 볼 수 있어서, 이게 더 나은지, 저게 더 나은지 등을 아주 빠르고 쉽게 파악할 수 있어요. |
| |
그러니까 JMP는 많은 것을 수용할 수 있지만, 아쉽게도 모든 것을 수용할 수는 없습니다. 그래서 수용할 수 없는 몇 가지 예를 들어 보겠습니다. 예를 들어, |
| |
기계 학습과 AI를 많이 수행하는 사람들은 일반적으로 많은 활성화 기능이나 많은 숨겨진 계층 노드가 필요한 자동 인코더나 합성 신경망과 같은 것에 적합할 수 있습니다. |
| |
JMP가 제공하는 것 외의 다른 활성화 함수가 있으므로 JMP 내에서 많은 작업을 수행할 수 없습니다. |
| |
또 다른 하나는 투영 추적 회귀(Projection Pursuit Regression)입니다. 또 다른 하나는 다변량 적응 회귀 스플라인(Multivariate Adaptive Regression Splines)입니다. 안타깝게도 JMP에서는 할 수 없는 몇 가지 기능이 있습니다. |
| |
R, 파이썬, MATLAB. |
| |
그 외에도 몇 가지가 더 있습니다. |
| |
하지만 저는 이 세 가지에 집중할 겁니다. 그러니까, 제가 여기서 논의할 아이디어들은 C++, Java, Rust, 또는 다른 어떤 언어로든 구현해 보는 게 좋을 겁니다. |
| |
생각나는 대로, 여러분은 그 중 많은 것을 사용할 수 있을 겁니다. |
| |
말씀드린 것처럼 모델 비교 플랫폼을 사용하여 다른 소프트웨어와도 비교할 수 있습니다. 그러면 무엇이 필요할까요? |
| |
따라서 모델을 맞추는 데 사용하는 소프트웨어에서 나온 모델 예측이 가장 중요합니다. |
| |
일반적으로 모델 피팅을 할 때, 특히 대규모 모델을 사용할 때, 데이터를 훈련 검증 세트 및/또는 테스트 세트로 나눌 수 있습니다. |
| |
훈련, 검증, 테스트 등 모든 소프트웨어에 대한 정보를 알려주는 것이 필요할 겁니다. 왜냐하면 적합성을 비교할 때 이러한 것들이 일관성을 유지해야 하기 때문입니다. |
| |
알겠습니다. 제가 이 강연에서 R, Python, MATLAB에 대해 집중적으로 다루기로 한 가장 큰 이유는 JMP와 스크립팅 언어가 실제로 자체 R 세션을 생성하고 거기에서 코드를 실행할 수 있기 때문입니다. |
| |
따라서 여기의 그림은 내가 어떤 출력에 선형 회귀 모델을 맞추려고 할 때 매우 빠르게 보여 줍니다. |
| |
보스턴 주택 데이터 세트에 대해 말씀드리겠습니다. 나중에 이 데이터 세트를 더 자세히 다루겠습니다. |
| |
하지만 R에서 선형 회귀 모델을 매우 빠르게 적합하고 예측값을 도출하고 싶다면 그렇게 할 수 있습니다. 물론 JMP를 사용할 수도 있습니다. 하지만 아주 간단한 예를 들어보겠습니다. |
| |
그래서, |
| |
주의할 점이 하나 있는데, 저는 R 3.6.3을 사용하고 있지만 JMP는 2.9보다 크면 무엇이든 처리할 수 있습니다. |
| |
마찬가지로 Python에서도 Python 세션을 직접 호출할 수 있습니다. 여기 그림은 Python으로 선형 회귀를 학습한 결과를 보여줍니다. 모든 코드를 단계별로 설명하지는 않겠지만, 기본적인 아이디어는 이해하셨을 겁니다. |
| |
물론 Python을 사용할 때는 Python 3.8.5 최신 버전이라는 점을 염두에 두세요. 하지만 Anaconda를 사용하여 설치하는 경우, 3.6 이상에서는 JMP가 Anaconda와 통신하는 데 문제가 있습니다. |
| |
이 데모에서는 3.6.5를 사용하고 있습니다. |
| |
마지막으로, 우리는 우리만의 MATLAB 세션을 만들 수도 있습니다. |
| |
여기서는 MATLAB 2019b를 사용하고 있습니다. 하지만 기본적으로 MATLAB 버전이 최근 7~8년 사이에 출시된 것이라면 아무 문제없이 작동할 것입니다. |
| |
좋아요, 그럼 어떻게 모든 걸 연결할까요? 실제로는 네 단계로 구성된 과정을 살펴보겠습니다. 먼저, 각 모델을 적합해야 합니다. 각 소프트웨어에 데이터와 각 관측치가 어떤 집합에 있는지 전송합니다. |
| |
모델을 적합시킨 후에는 적합 결과와 예측 결과를 출력하여 JMP에서 볼 수 있는 데이터 테이블에 추가해야 합니다. |
| |
그러니 당연히 경고하고 싶은 건, 모델에 어디에 들어맞는지, 어떻게 들어맞는지 알 수 있는 것들을 꼭 제시하라는 겁니다. 두 가지 모두에 대한 예시가 있습니다. |
| |
세 번째 단계는 모델에 따라 모델 진단을 살펴보는 것입니다. 모델이 적합하다고 해서... 수치상으로는 잘 맞는 것처럼 보이지만, 예를 들어 잔차 그림을 살펴보면... |
| |
가장 큰 관심 분야가 잘 맞지 않습니다. |
| |
아니면 잔차에 문제가 있는 거겠죠. 이런 종류의 정보도 출력하는 방법을 보여드리겠습니다. |
| |
그리고 마지막으로 모델 비교 플랫폼을 사용해서 모든 것을 하나의 큰 표로 모아 숫자를 비교할 겁니다. 앞뒤로 뒤집어야 하는 것보다 훨씬 더 쉽습니다. |
| |
좋아요, 이제 각 단계를 좀 더 자세히 살펴보겠습니다. 모델 피팅을 수행하는 첫 번째 단계에서는 기본적으로 두 가지 옵션이 있습니다. 먼저, JSL을 통해 JMP에 원하는 소프트웨어를 호출하도록 설정할 수 있습니다. |
| |
데이터와 그에 맞는 코드를 보내주세요. 그래서, 사실, 잠깐 여기서 벗어나서 바로 그 작업을 하려고 합니다. |
| |
보시다시피, 실제로 R을 호출하기 위한 코드가 있습니다. |
| |
다 끝나면 Python을 호출하고, 다 끝나면 MATLAB을 호출해서 모든 것을 연결하겠습니다. 코드에 대해서는 잠시 후에 자세히 설명하겠지만, 실행하는 데 3~4분 정도 걸릴 것 같습니다. 지금 바로 시작하겠습니다. |
| |
그리고 우리는 준비가 되면 그에게 돌아올 것입니다. |
| |
그래서 다른 옵션은 검증을 위한 데이터 세트를 만드는 것입니다. 검증 열과 테스트 열 중 하나를 데이터 세트에 추가하면 됩니다. |
| |
세트는 데이터를 분할하고 있었습니다. 어떤 소프트웨어에서든 실행되도록 예약되어 있고, 실행에 필요한 모든 소프트웨어에서 출력이 이루어집니다. |
| |
물론 몇 가지 경고가 있습니다. 사용 중인 소프트웨어가 모델에 실제로 필요한 기능을 갖추고 있는지 확인하세요. |
| |
실제 물건과 비교하기 전에 모델이 완벽하게 맞춰졌는지 확인하세요. |
| |
출력 형식이 JMP에서 실제로 읽을 수 있는 형식인지 확인하세요. 다행히 JMP는 꽤 많은 데이터를 읽을 수 있으므로, 네 가지 경고 중 가장 큰 문제는 아닙니다. |
| |
하지만 앞서 경고했듯이 각 모델의 예측이 원래 데이터 세트의 올바른 관찰 결과와 일치하는지 확인하세요. |
| |
그래서 그것은 훈련인지, 훈련 관찰인지, JMP에 맞춰질 때로 돌아갑니다. |
| |
어떤 소프트웨어에 적용하든 훈련 관찰이어야 합니다. JMP에서 검증이라면 다른 곳에서도 검증이 됩니다. JMP에서 테스트라면 다른 곳에서도 테스트가 됩니다. |
| |
그러니 모든 것이 정확하게 일치하는지 확인하세요. 테스트 세트를 보고 "아, 이게 훨씬 더 잘 맞네."라고 말하는 건 정말 원치 않는 일이니까요. 관측치들이 가중치가 다르게 적용되었고, 실제 이상치가 없었기 때문입니다. 결국 생각이 왜곡되는 거죠. |
| |
조심해야 할 말이 있어요, 잠깐만요, 조심해야 할 말이 있어요. |
| |
좋아요. 제가 암시했듯이, 현재 백그라운드에서 실행 중인 예제가 있습니다. 제가 하는 일에 대해 좀 더 자세히 설명해 드리고 싶습니다. |
| |
R, Python, MATLAB에서 신경망을 구현할 예정입니다. R에서 이 작업을 하려면 R의 기본 설치 패키지 외에 Keras 패키지와 Tensorflow 패키지 두 개를 추가로 설치해야 합니다. |
| |
numpy, pandas, matplotlib. |
| |
Numpy를 사용하면 계산을 꽤 쉽게 할 수 있고, Pandas를 사용하면 데이터 조작도 좀 할 수 있고, Matplotlib을 사용하면 플롯을 만드는 것도 꽤 간단할 겁니다. 그리고 MATLAB에서는 딥러닝 툴박스를 사용하는데, 여러분이 사용할 수 있든 없든 상관없습니다. |
| |
좋습니다. 두 번째 단계는 JMP 데이터 테이블에 예측을 추가하는 것입니다. JMP를 사용하여 소프트웨어를 호출하면 JSL 코드를 사용하여 해당 예측을 검색하여 데이터 테이블에 추가한 후 나중에 비교할 수 있습니다. |
| |
그러면 다른 방법은 소프트웨어가 스스로 실행되어 출력을 저장하는 것입니다. JMP에 빠르게 명령하여 출력 파일을 가져온 다음, 결과를 저장한 데이터 테이블에 예측 결과를 가져오도록 조작할 수 있습니다. |
| |
이제 진단 플롯도 읽을 수 있습니다. 이 경우 일반적으로는 진단 플롯을 그래픽 파일로 저장합니다. 저는 PNG 파일을 사용할 것입니다. 하지만 물론, |
| |
사용할 수 있는 그래픽입니다. JMP가 모든 것을 다 처리할 수는 없지만, PNG는 jpg와 일부 파일을 매핑하는 데 사용할 수 있다고 생각합니다. 일반적인 그래픽은 모두 처리할 수 있죠. |
| |
그래서 두 번째 메모는 모델 비교 플랫폼에 사용되지만, 어떤 모델에 맞는지, 어디에 맞는지 식별하는 데 도움이 됩니다. |
| |
일반적으로 예측 열을 추가할 때마다 다음 속성을 추가하는 것이 좋습니다. 관심 있는 데이터 테이블을 전송하는 것을 볼 수 있는데, 이 속성을 예측이라고 합니다. |
| |
따라서 여기서 우리는 사물을 예측하는 데 사용하는 것이 무엇이든지 가지고 있습니다(지금 여기서는 값이 아마도 최선의 선택이 아닐 것입니다) |
| |
하지만 이 생성기를 사용하면, 이 모델을 실제로 만드는 데 어떤 소프트웨어를 사용했는지 알 수 있습니다. 그래서 여기서는 R을 사용했습니다. 화면에 맞게 R을 보여줍니다. Python과 MATLAB은 좀 길었지만, 원하는 문자열을 입력할 수 있습니다. |
| |
곧 코드를 조금 더 자세히 살펴보면 알 수 있을 겁니다. |
| |
그러니까, 나중에 R에서 여러 모델을 적용할 때 이 기능이 유용하죠. 열 이름을 제대로 선택하고 R에서 생성한 열이 여러 개 있어도, 실제로 보고 있는 모델이 무엇인지 알 수 있습니다. |
| |
좋아요, 일반적인 모델 비교 대화 상자는 이런 모습입니다. |
| |
한 가지 주의할 점은, 모델 피팅의 마지막 부분에서 포인트 앤 클릭을 했을 때의 대략적인 모습입니다. 보시다시피 여러 개의 예측 변수가 있습니다. MATLAB, Python, R을 위한 신경망을 가지고 있습니다. |
| |
다양한 예측 형태; 저는 몇 가지 사항에 맞게 JMP를 사용했습니다. |
| |
이제, 사람들이 종종 하는 일은 이 검증 열을 그룹으로 넣는 것입니다. |
| |
훈련 검증과 테스트를 그룹화할 수 있도록 말이죠. 사실 저는 By 문에 넣으면 출력 결과가 좀 더 마음에 듭니다. 나중에 보여드리겠습니다. 하지만 둘 중 하나를 사용할 수도 있습니다. |
| |
하지만 결론적으로 저는 이런 방식의 결과물을 더 좋아합니다. |
| |
그래서 이것이 지금 내가 분명히 볼 수 있는 가장 큰 이유인데, 이것들은 모두 훈련이에요. |
| |
이것들은 모두 검증(헤더에서 볼 수 없음)이고 이것들은 모두 테스트입니다. |
| |
검증을 그룹 변수로 사용하면 21개 항목이 있는 큰 표 하나가 생성됩니다. 이제 열이 하나 더 생깁니다. "training validation test"라고 되어 있는데, 제 경우에는 012라고 되어 있습니다. |
| |
이렇게 단어를 쓰면, 그렇게 어렵게 생각할 필요도 없고, 012가 무슨 뜻인지, 이런저런 설명할 필요도 없어요. 그래서 제가 그런 선택을 한 거예요. |
| |
좋아요, 제가 설명할 예시에서는 보스턴 주택 데이터 세트를 사용하겠습니다. 이 데이터 세트는 JMP에 포함되어 있습니다. 그래서 제 프레젠테이션에 파일로 수록하지 않았습니다. JMP가 있다면 이미 포함되어 있으니까요. |
| |
그래서 Harrison과 Rubinfeld는 주택의 중간 가치에 대한 여러 가지 예측 인자를 가지고 있었습니다. 여기에는 1인당 범죄율, 도시당 비소매 사업 면적 비율 등이 포함됩니다. |
| |
당신이 구입하려고 하는 것이 무엇이든 간에, 그 안에 있는 평균적인 방의 수, 도시별 교사와 학생의 비율(따라서 교사는 많고 학생은 적다면 일반적으로 더 나은 교육을 의미합니다. 많은 사람들이 그렇게 생각합니다. |
| |
(발견됨)과 다른 여러 가지가 있습니다. 여기서 13가지를 모두 다루지는 않을 겁니다. |
| |
좋아요, 그럼 제가 여기서 어떤 모델을 살펴봤는지에 대한 배경 설명을 좀 드리겠습니다. 그리고 JSL 코드를 자세히 살펴보고 모든 것을 어떻게 배치했는지 설명하겠습니다. |
| |
제가 살펴본 모델 중 몇 가지가 있습니다. 우선, 전형적인 선형 회귀 모델입니다. 여기 간단한 선형 회귀 모델이 있습니다. 세율별로 중간값을 맞춰 봤습니다. |
| |
물론 다중 선형 회귀 분석을 사용하고 이를 모두 사용할 것입니다. |
| |
그래서, |
| |
하지만 13개의 서로 다른 예측 변수가 있고, 그 중 일부는 서로 상관 관계가 있을 수 있다는 것을 알고 있었기 때문에, 다른 유형의 회귀 분석도 살펴볼 가치가 있을 것이라고 결정했습니다. |
| |
그중 하나는 브리지 회귀라고 하는 것입니다. 사실, 이 회귀는 기본적으로 제약 조건이 추가된 선형 회귀입니다. |
| |
매개변수의 제곱 값은 어떤 상수보다 클 수 없습니다. |
| |
할 수 있어요... 사실 이걸 람다의 어떤 값이 C의 어떤 값에 대응하는 최적화 문제로 다시 쓸 수 있어요. |
| |
그래서 저는 일반적으로 보던 최소 제곱법과는 달리 이 추가적인 페널티 항목을 사용하여 이를 최소화하려고 합니다. |
| |
이걸 수축법이라고 부르는 이유는 당연히 이걸 점점 더 작게 만들수록 이 모든 것들이 0에 점점 더 가까워지기 때문입니다. 그러니 얼마나 제한적으로 만들지 신중하게 생각해야 합니다. |
| |
이제 수축으로 인해 모든 사람이 서서히 0으로 줄어들 것입니다. 하지만 다른 유형의 페널티 항을 사용하면 일부 항을 완전히 제거할 수 있습니다. |
| |
라쏘라는 걸 사용할 수도 있습니다. 여기서 제약 조건은, 좋아요, 매개변수 추정치의 제곱 대신 매개변수 추정치의 절댓값의 합을 구하는 것입니다. |
| |
그래서 실제로 일어나는 일은 매우 약한 사람들이 매개변수 추정치를 0으로 설정한다는 것입니다. 이는 일종의 역할을 합니다. |
| |
즉, 중요하지 않은 용어를 제거하는 것입니다. |
| |
라소 회귀와 능형 회귀가 어떤 역할을 하는지 시각적으로 보여드리죠. 능형 회귀에서 원은 페널티 항을 나타냅니다. |
| |
여기서는 매개변수 공간을 살펴보고 있습니다. 따라서 실제 최소제곱 추정값은 여기에 있을 것입니다. 하지만 추가적인 제약 조건 때문에 아직은 그 수준에 도달하지 못했습니다. |
| |
결국, 우리는 원에 닿는 최소값을 어디에서 얻을 수 있는지, 즉, 기본적으로 어디에서 찾을 수 있는지 알아냅니다. 그리고 이것이 바로 능형 회귀 모수 추정값입니다. |
| |
올가미도 비슷한 그림이지만, 절댓값을 보면 원보다는 마름모꼴에 더 가깝습니다. 참고로, 이건 2차원입니다. 물론, 초구(hyper sphere)와 그 외 다양한 도형들을 살펴볼 겁니다. |
| |
하지만 여기서 보시다시피, 다이아몬드 끝부분에 바로 닿아 있습니다. 따라서 이 경우 베타 1은 실제로 0입니다. 이렇게 항이 제거되는 거죠. |
| |
좋아요, 또 다른 하나는 회귀 트리라는 것입니다. JMP는 이를 위해 파티션 플랫폼을 사용합니다. 이것이 무엇을 보여주는지 간단히 보여드리자면, 모든 데이터가 준비되었다고 가정하겠습니다. |
| |
그래서 제가 스스로에게 묻는 첫 번째 질문은 집에 방이 몇 개냐는 것입니다. 그리고 방의 크기가 0.943이 될 수는 없다는 것을 알고 있습니다. |
| |
방이 여섯 개 이하입니다. 그러니 트리의 이 부분으로 내려가 보세요. 트리의 이 부분으로 내려가지 마세요. 이제 방이 일곱 개 이상이면, 중앙값을 예측하게 될 겁니다. |
| |
가치는 37입니다. 수만 달러에 해당하므로 37만 달러로 정하세요. |
| |
7보다 작다면, 제가 물어야 할 다음 질문은 lstat의 크기가 얼마인가?입니다. |
| |
그러니까 14.43보다 크거나 같다면 이 노드를 보면 갑자기 내 주택 평균 가격이 15만 달러 정도로 추산되고, 여기로 오면 23만 3천 달러 정도가 될 겁니다. |
| |
회귀 트리의 실제 기능은 입력 공간을 여러 영역으로 분할하는 것입니다. 그리고 해당 영역 내의 모든 값에 동일한 예측을 적용하는 것입니다. |
| |
여기서 볼 수 있듯이 저는 분할했습니다... 이 경우에는 그리기가 더 쉽기 때문에 2차원을 사용하고 있습니다... |
| |
여기 이 트리를 보실 수 있는데, 먼저 x1을 살펴봅니다. 이제 x2를 보고 x1에 대해 또 다른 질문을 하고, x2에 대해 또 다른 질문을 합니다. 이렇게 해서 입력 공간을 분할하게 됩니다. |
| |
이제 이 다섯 가지 각각은 예측값을 갖게 됩니다. 그리고 이것이 기본적으로 이 그림의 모습입니다. 위에서 보면 정확히 이 값을 얻게 됩니다. 하지만 여기서는 |
| |
예측은 5개 영역 중 어느 영역이 맞는지에 따라 약간 다릅니다. |
| |
이제, 이 중 하나를 정확히 맞추는 방법에 대한 자세한 내용은 다루지 않겠지만, |
| |
제임스, 위튼, 티브시라니, 프리드먼이 약간 언급했고, 레오 ???가 이에 대한 선구적인 책을 썼으므로 거기서 살펴볼 수 있습니다. |
| |
다음으로, 요즘 머신 러닝 등에서 많이 활용되고 있는 신경망에 대해 이야기해 보겠습니다. 이 그림은 신경망의 모습을 시각적으로 보여줍니다. 이 그림은 5개의 입력과 13개의 입력을 사용하여 신경망을 전달합니다. |
| |
이것들...이 숨겨진 계층에. 그리고 이들 각각은 활성화 함수를 통해 변환됩니다. |
| |
그리고 이러한 각 활성화 함수에 대해 출력을 얻고, 우리는 이를 사용할 것입니다... |
| |
종종 우리는 이러한 출력의 선형 회귀를 사용하여 중앙값을 예측합니다. |
| |
좋아, 그럼 |
| |
사실, 신경망은 결국 비선형 모델이고, 실제로 신경망이라고 불리는 이유는 일반적으로 인간의 뇌에서 뉴런이 작동하는 방식을 우리가 보는 방식으로 표현하기 때문입니다. |
| |
따라서 각 입력은 은닉층의 노드로 전달될 수 있습니다. 은닉층에서 입력은 활성화 함수를 통과하고 출력이 계산되며, 각 출력은 다른 은닉층의 노드로 전달되거나 네트워크의 출력이 될 수 있습니다. |
| |
이제 JMP에서는 숨겨진 레이어를 두 개만 사용할 수 있습니다. |
| |
사실, 신경망을 만드는 것과 관련해서 20개만 있어도 된다는 말은 없습니다. |
| |
지금 우리가 걱정하는 건 바로 이것입니다. 사실, 어떤 통계 이론에 따르면, 어떤 연속 함수든 근사할 수 있다고 합니다. |
| |
몇 가지 경계 조건과 두 개의 은닉층이 주어진 상황에서 JMP가 그런 결정을 내린 이유가 바로 여기에 있을 것입니다. |
| |
선형, 쌍곡선 탄젠트, 가우시안 방사형 기저를 사용합니다. 사실, |
| |
여기 이 노드들에서 작은 곡선을 보세요. 아마 쌍곡선 탄젠트 함수일 겁니다. 선형 함수는 위로 올라가는 직선이 될 겁니다. 가우시안 방사형 기저 함수는 정규 곡선에 더 가까워 보일 겁니다. |
| |
이게 바로 신경망 플랫폼입니다. 마지막으로 살펴볼 것은 투영 추적 회귀(Projection Pursuit Regression)입니다. JMP에서는 할 수 없는 기능을 구현해 보고 싶었는데, 예를 들어 보겠습니다. |
| |
음, 투영 추적 회귀는 스탠퍼드의 제롬 프리드먼과 스토이츨레가 처음 제안한 모델이었습니다. 그들의 모델은 예측을 바탕으로... y = 베타 i, f sub i, 그리고 입력값의 선형 변환 형태의 예측을 수행합니다. |
| |
그래서 이건 사실 신경망과 어느 정도 유사합니다. 여기에는 k개의 노드가 있는 하나의 은닉층이 있고, 각 층은 활성화 함수 fi를 갖습니다. |
| |
L. 투영을 통해 회귀를 추적하면 실제로 f sub i도 추정하게 됩니다. |
| |
일반적으로 스무더(smoother) 또는 스플라인(spline) 적합을 합니다. 일반적으로 f sub i는 리지 함수라고 합니다. 이제 알파, 베타, 그리고 최적화해야 할 F가 있습니다. 따라서 일반적으로 단계적 적합이 수행됩니다. 이 시점에서는 너무 자세히 다루지 않겠습니다. |
| |
좋아요, 저는 제 모든 모델을 살펴보았습니다. |
| |
이제 몇 가지 출력을 보여드리겠습니다. 잘 되길 바랍니다. JMP를 시작하기 전에 한 가지 알아두어야 할 점은 |
| |
R, Python, Keras에서 신경망의 시드를 설정하는 것은 정말 어렵습니다. 제 코드를 그대로 실행해 보면 제가 얻은 결과와 정확히 일치하지는 않겠지만, 거의 비슷할 것입니다. 자, 그럼, |
| |
자, 이제 무슨 결과가 나왔는지 봅시다. 제가 얻은 결과는 이렇습니다. 안타깝게도 모든 것이 완벽하게 실행된 것 같지는 않습니다. |
| |
그래서, |
| 루카스 |
여기 뭐가 있죠? 훈련, 검증, 그리고 테스트가 있습니다. 그래서 이 모델 중 하나가 잘 맞지 않았다는 것을 금방 알 수 있습니다. R 내부의 신경망에서 안타깝게도 끔찍한 일이 발생했습니다. |
| |
아마 입력 공간에서 처음부터 잘못된 위치를 잡은 것 같습니다. 그래서 좋은 모델에 맞지 않았던 거죠. |
| |
그래서 불행하게도 비선형 모델의 시작 매개변수는 중요합니다. 어떤 경우에는 매개변수에 의해 피해를 입기도 합니다. |
| |
하지만 다른 모든 것을 살펴보면, 나머지는 꽤 잘 맞는 것 같습니다. 정확히 무엇이 잘 맞는지에 대해서는 논쟁의 여지가 있지만, R 제곱이 0.5보다 하나 더 높은 것을 볼 수 있습니다. 제곱근 평균이 보입니다. |
| |
제곱 오차는 약 5 정도이고, 평균 절대 오차도 3 범위에 있습니다. 이제 학습을 위해 투영 추적 회귀가 가장 좋은 결과를 보이는 것 같습니다. |
| |
검증 데이터 세트로 내려가면 여전히 R처럼 보입니다. |
| |
투영 추적(projection pursuit)이 가장 좋은 결과를 보였습니다. 하지만 테스트 데이터 세트를 살펴보면, 갑자기 투영 추적 회귀가 두 번째로 나빴습니다. R의 신경망을 무시한다고 가정하면, 두 번째로 나빴습니다. |
| |
이런 프레임워크에서는 종종 테스트 데이터 세트를 가장 가까이서 살펴보게 되는데, 그 이유는 모델 적합성을 판단하는 데 테스트 데이터 세트가 어떤 방식이나 형태로도 사용되지 않았기 때문입니다. |
| |
그리고 우리는 그것을 기반으로 보면 다음과 같습니다. |
| |
JMP의 능형 회귀가 가장 잘 맞습니다. |
| |
여기서 볼 수 있듯이 R 제곱은 여기에서 .71이었고 이전에는 약 .73이었고 여기에서는 약 .73이었으므로 일관되게 맞는 것을 볼 수 있습니다. |
| |
세 가지 데이터 세트 모두에서 동일한 결과가 나왔습니다. 따라서 지금 당장 보이는 것만으로 결정을 내려야 한다면, 아마도 다음과 같은 방법을 선택할 것입니다. |
| |
능형 회귀 분석입니다. 그러니까, 여기 아래에는 진단 도구 등이 잔뜩 있습니다. R의 신경망에서 무슨 일이 일어났는지 보고 싶다면, |
| |
아주 빠르게 알 수 있는데, 몇 걸음만 들어가도 뭔가 일이 벌어졌어요. 보시다시피, 거의 모든 게 22만 명 정도로 예측되는데, 정말 형편없이 맞춰져 있네요. |
| |
그래서 우리는 이것을 맞추는 동안 뭔가 문제가 생겼다는 걸 알고 있습니다. |
| |
그래서 능선 회귀가 가장 좋은 것 같다는 걸 확인했습니다. 그럼 어떤 결과가 나오는지 살펴보죠. 잠시 후에 제 JSL 코드를 아주 간략하게 보여드리겠습니다. |
| |
제가 어떻게 이 모든 작업을 했는지 보여드리지만, 음, 여기 능형 회귀 분석의 모수 추정값을 볼 수 있습니다. 능형 진단 플롯도 볼 수 있으니, 원래 추정값에서 크게 줄어들지는 않았습니다. |
| |
로그를 통한 검증 테스트를 통해 이런저런 일이 일어나는 것을 볼 수 있습니다. |
| |
그리고 오른쪽에는 본질적으로 잔차 플롯이 있습니다. 이 플롯들은 실제값과 예측값입니다. |
| |
훈련 데이터에서 보시다시피, 예측이 잘 안 된, 꽤 비싼 값들이 몇 개 있었던 것 같습니다. 테스트 데이터셋보다 적은 값을 보이는데, 큰 문제는 없었던 것 같습니다. 여기 몇 가지 이상한 점이 있지만, 일반적으로 볼 수 있습니다. |
| |
가격이 낮은 주택의 경우, 세 가지 데이터 세트 모두에 상당히 잘 맞습니다. 다시 한번, 이 데이터 세트에서 무슨 일이 일어났는지 자문해 보고 싶을 수도 있지만, |
| |
현재로서는 이게 제일 나은 것 같습니다. 다른 사람들도 볼 수 있을 것 같네요. |
| |
여기 보세요. 그러면 MATLAB에 대해 잠깐 살펴보겠습니다. |
| |
여기서 학습 테스트 검증도 볼 수 있습니다. MATLAB에서 진단 관련 내용을 하나 뱉어내는데, 완료하는 데 몇 에포크가 걸린 것을 볼 수 있습니다. |
| |
하지만 다행히도 MATLAB는 우리가 알 수 있듯이 매우 빠르게 실행됩니다. |
| |
그리고 실제로 여기서 예측된 것이 있습니다. |
| |
우리는 이 모든 것을 볼 수 있습니다. |
| |
좋습니다. 그럼 지금부터 몇 분 동안 코드를 살펴보겠습니다. |
| |
물론, 몇 가지 주의 사항이 있습니다. 실제로 이 모든 것을 실행할 수 있도록 모든 것이 설치되어 있는지 확인하세요. 그렇지 않으면 JMP가 완전히 실패할 것입니다. 예측을 내놓지 못하고 예측을 찾지 못해서 실패할 것입니다. |
| |
JMP에는 코드로 검증 열을 생성할 수 있는 기능이 있습니다. 그래서 저는 60 20 20을 선택했습니다. 여기서도 난수 시드를 선택한 이유는 제가 사용하는 것과 동일한 학습 검증 테스트 세트를 사용할 수 있도록 하기 위해서입니다. |
| |
그래서 사실, 지금 당장은 어떤 것이 학습, 검증, 테스트인지 저장하는 게 목표입니다. 해당 열을 잠시 삭제하려고 합니다. |
| |
제가 여기서 이렇게 하는 이유는 데이터 세트를 R, Python, MATLAB으로 보내고 모든 것이 출력이거나 모든 입력일 때 코딩하기가 더 쉽기 때문입니다. |
| |
그래서 둘 다 아닌 유효성 검사 열은 원하지 않았고, 그렇게 하면 좀 더 어려워지더군요. 그래서 결국 데이터 세트를 전송했습니다. |
| |
훈련, 검증, 테스트 행을 보낸 다음 R 코드를 호출하여 실행합니다. 이제 실제로 |
| |
실제 R 코드를 여기에 넣으세요. 스크롤을 끝없이 하지 않아도 되도록 한 줄만 적었습니다. 하지만 여러분을 막을 것은 없습니다. 앞서 발표에서 보셨던 것처럼 몇 줄 정도면 바로 여기에 붙여넣을 수 있습니다. |
| |
그래서 일단 완료되면... 이 코드가 튀어나옵니다. |
| |
진단 결과 사진입니다. 6~7번 반복한 후에 멈췄습니다. 이게 해결됐는지 확인해 볼까요? |
| |
그리고 이 스크립트에 능선 회귀를 적용해서 두 장의 사진을 얻습니다. 그래서 이것도 출력해서 저장하고, 윤곽선 상자도 만듭니다. 이제 이 모든 것을 코드 끝에 모두 합칩니다. |
| |
그리고 출력을 받으면 잠시 후에 데이터 테이블에 추가하겠습니다. |
| |
좋아요, 여기에 코드를 조금 추가해 보겠습니다. 예를 들어 관측치가 600만 개이고 모델을 실제로 적합시키는 데 24시간이 걸린다고 가정해 보겠습니다. 그러면 JMP에서 실행하고 싶지 않을 겁니다. |
| |
따라서 여기에서 할 수 있는 작은 코드는 다음과 같습니다. "안녕, 나는" |
| |
좋아요, 제가 관심 있는 데이터 테이블을 열겠습니다. 그동안 R에게 다른 곳에서 실행하라고 할 거예요. 제 시스템에서 "완료!"라는 녹색 불이 켜지면 "좋아요, 그 출력을 열어서 가져오겠습니다."라고 말할 수 있을 거예요. |
| |
제 데이터 테이블입니다. 이렇게 하면 그런 작업을 할 수 있는 한 가지 방법이 될 수 있습니다. 물론 사진 파일을 어딘가에 저장하고 이 코드도 사용할 수 있겠죠. 하지만 이 코드는 완전히 똑같을 겁니다. |
| |
좋아요, Python의 경우 매우 유사할 겁니다. 이것들을 전달하겠습니다. Python 코드를 실행하고 진단 플롯과 예측을 출력합니다. |
| |
Python 코드를 몇 개 드리겠습니다. 보시다시피 JMP에서 했던 것과 매우 유사합니다. 이번에는 CSV 파일을 열어서 열을 복사하고 닫겠습니다. 더 이상 필요 없으니까요. |
| |
그리고 MATLAB에서 똑같은 게임을 다시 해 봅시다. 애셋을 만들고 MATLAB 스크립트를 실행해 봅시다. 여기서 뱉어낸 PNG 파일을 가져와서 필요한 곳에 저장하고, 예측 결과도 저장해 봅시다. 그리고 필요하면 가져와도 됩니다. |
| |
여기 내부에서 실행하는 대신, 간단한 샘플 코드를 사용하면 됩니다. |
| |
좋아요, 이제 R, Python, Matlab 호출을 마쳤으니 JMP에서 사용할 수 있도록 검증 열을 다시 가져옵니다. 어떤 열이 어떤 열인지 기억하고 있으니까요. |
| |
기본적으로 JMP는 우리가 사용할 검증 열의 값을 살펴봅니다. 가장 작은 값은 학습, 그 다음으로 큰 값은 검증, 가장 큰 값은 테스트입니다. 이제 K-폴드 교차 검증을 수행하면 어떤 폴드인지 알려줍니다. 따라서 012345678 등으로 계속 이어집니다. |
| |
그럼 이걸 만들어 보세요. 그리고 저는 여기에도 이걸 만들어서 012 대신 실제로 출력에 training, validation, test라고 표시되도록 했습니다. 그래서 좀 더 명확하게 보이도록요. |
| |
이해하세요. 그러니까 JMP를 한 번도 사용해 본 적이 없는 사람에게 보여주려고 한다면, 012가 무슨 뜻인지는 몰라도 훈련, 검증, 테스트가 무엇인지는 알 수 있을 겁니다. |
| |
좋아요, 이제 데이터 테이블에 예측을 추가해 보겠습니다. 음, 여기 제가 앞서 말씀드린 집합 속성이 있습니다. |
| |
제 생성자는 MATLAB이고, 열 이름을 지정했으니 MATLAB용 신경망 예측이라는 걸 알 수 있죠. 그래서 생성자가 꼭 필요한 건 아니지만, 혹시 이름을 좀 엉성하게 지을 수도 있으니 |
| |
죄송합니다. |
| |
그래서 우리는 투영 추구 회귀, 신경망 등을 모두 얻을 수 있습니다. |
| |
그리고 저는 JMP에서 능형 회귀, 라쏘, 선형 회귀를 적용했다는 것도 기록했습니다. |
| |
그래서 여기서 다 해봤습니다. 적합 모델, 일반화 회귀 분석을 해봤습니다. 이 모든 걸 쏟아내세요. |
| |
내 예측 공식을 알려주세요. |
| |
마지막에 전체 출력을 예측하여 실제 출력을 표시합니다. |
| |
신경망을 맞춰보겠습니다. 검증 열이라고 할까요? 공변량을 옮기는데, 일반적으로 신경망은 출력값이 보통 어떤 값이든 0에 가까울 때보다 0에 가까울 때 더 잘 맞춰지는 경향이 있습니다. |
| |
첫 번째 은닉층에는 세 개의 노드가 있습니다. 두 번째 은닉층에는 두 개의 노드가 있습니다. 여기서는 두 노드 모두 선형 활성화 함수입니다. 위의 세 가지 활성화 함수는 제한 선형 단위 활성화 함수를 사용했기 때문에 약간 다릅니다. |
| |
하지만 제 생각에는 둘 다 비슷하게 맞는 것 같습니다. |
| |
5. 즉, 다섯 가지의 다른 시작 값 세트를 시도해 보고, 그 중 가장 좋은 것을 유지하겠다는 뜻입니다. |
| |
제 코드에서 알 수 있듯이, 아마 R로 그렇게 했어야 했을 겁니다. 네 번의 루프를 돌면서 여러 번 시도한 후 가장 좋은 결과를 내는 방식을 사용했거든요. 앞으로 작업할 때는 이 방식을 사용할 것 같습니다. |
| |
그럼 그 자료들을 저장하고 이제 모델 비교를 할 준비가 된 겁니다. 이제 모델 비교에 새 열을 모두 가져옵니다. |
| |
조금 스크롤해 보세요. 앞서 언급했듯이 여기서는 유효성 검사를 통해 검증을 진행하고 있습니다. |
| |
마지막으로 제가 원하는 대로 보이도록 약간의 코딩을 하고 있습니다. |
| |
그래서 저는 JMP에 일반적으로 나와 있는 내용 대신, 훈련 진단, 검증 진단, 테스트 진단에 대해서만 언급된 개요 상자를 받게 됩니다. |
| |
진단용 플롯을 가져올게요. |
| |
이제 여기서 제가 말하고자 하는 것은 단지 그 핸들을 잡는 데 필요한 출력의 일부만 원한다는 것입니다. |
| |
모든 잔차 플롯이 즉시 출력되는 것은 아니므로, MATLAB, Python, R에서 만든 잔차 플롯을 빠르게 만들어 보겠습니다. |
| |
그런 제목을 정한 후에 여기서는 큰 표나 큰 대화를 만듭니다. |
| |
그리고 저는 모든 것을 일지에 기록합니다. |
| |
깔끔하고 깔끔하게 만들려고요. 여러 가지를 닫아서 걱정할 필요가 없도록요. 그리고 마지막에 제가 하고 싶었던 건, 이 중 하나를 열었을 때, |
| |
그 아래의 다른 모든 것은 즉시 열려 있습니다. |
| |
여섯, 일곱 가지를 클릭해야 해요. 보시다시피, 여기와 여기를 클릭해야 해요. |
| |
여기, 세 개 더 있어요. 하나 더 있는 것 같아요. 죄송해요. 하지만 이렇게 하면 이 중 어떤 것도 클릭할 필요가 없어요. 자동으로 열리거든요. |
| |
마지막 코드는 이런 역할을 합니다. |
| |
좋아요. |
| 루카스 |
그러니까 이건 출력과 라이브 실행의 차이일 뿐입니다. 하지만 이렇게 보일 수도 있습니다. |
| |
제가 말씀드렸듯이, 코드에서 보셨듯이, 우리가 본 것과 다른 것을 보셨을 겁니다. |
| |
리차드 |
| 루카스 |
아니요. 결론적으로, 모델 비교 플랫폼은 여러 모델의 예측 능력을 한곳에서 비교할 수 있는 매우 유용한 도구입니다. 여러 모델을 번갈아 가며 살펴볼 필요가 없습니다. 바로 눈앞에 있는 모든 것을 볼 수 있습니다. |
| |
이러한 유연성은 JMP에 맞지 않는 모델을 맞추거나 JMP에 맞지 않는 모델을 비교하는 데에도 사용할 수 있습니다. |
| |
이를 통해, 시간이 오래 걸리는 매우 큰 모델을 적합해야 할 경우, 적합을 진행하도록 지시할 수 있습니다. JMP에서 모든 데이터를 가져오고 모든 결과를 매우 쉽게 확인하여 다음 단계를 결정할 수 있습니다. |
| |
그럼, 시간 내주셔서 감사드립니다. |