더미화?? 그것은 과연?
우리는 범주로 구성되어 있는 자료를 분석할 때 흔히 더미화, 원핫인코딩 등을 통해 자료를 변화시킨다. 과연 이러한 더미화는 모델링에서 어떤 영향을 미칠까?
회귀분석에서 주로 얘기되는 더미화는 해당 범주별로 가중치를 다르게 주려고 사용한다. 예를 들어 회귀분석을 통해 몸무게를 예측할 때 성별이라는 변수가 고려되었다고 한다면, 성별이 남자일 때 beta0에 남성의 weight만큼 더해지고, 성별이 여성일 때 beta0에 여성의 weight 만큼 더해져 좀 더 정교하게 예측하게 된다.
Tree기반 모델에서는 과연 더미화는 어떤 역할을 할까? Tree 기반 모델에서는 더미화가 오히려 성능에 악영향을 주는경우가 종종 발생한다. 트리모델에서는 범주별로 이진화를 하게 되는데 만약 더미화를 하게되면 범주별로 변수처럼 인식하게 되므로 True, False 단 두가지로 분류되게 된다. 즉, 이 경우 더미화를 하게됨으로써 덜 정교하게 예측하게 된다.
물론 절대적인 얘기는 아니다. 다만 모델링에서 더미화를 할지 말지는 모델에 따라 고민이 필요하다는 것이다.
'머신러닝' 카테고리의 다른 글
calibration Curve (0) | 2020.08.19 |
---|---|
보루타(boruta algorithm) (0) | 2020.08.09 |
Dynamic Time Warping(동적 시간 접합) (0) | 2020.07.09 |
성능평가지표 (0) | 2020.04.26 |
과적합이 좋지 못한 이유? (0) | 2020.01.20 |
[numpy install]
pypy3 -m pip install --extra-index-url https://antocuni.github.io/pypy-wheels/manylinux2010 numpy
'python' 카테고리의 다른 글
pyinstaller (0) | 2020.11.20 |
---|---|
matplotlib 시각화 정리 [여러 그림 그리기, quiver plot] (0) | 2020.11.05 |
python package 생성 (0) | 2020.08.17 |
python gridSearch, RandomSearch (0) | 2020.07.30 |
명령프롬프트로 anaconda 열기 (0) | 2020.07.01 |
calibration Curve
우리는 머신러닝의 성능을 정량적으로 평가를 하기위해 성능평가지표를 사용한다.
이러한 성능평가지표는 예측한 것들 중 얼마나 제대로 예측을하였는가에 관한 지표들이다.
하지만 모델은 때로 과대 과소추정되기도 한다. 이를 개선하기 위해서 우리는 calibration curve를
활용할 수 있다.
그 원리는 나름 간단하다. 예측값이 예측한 target을 범주화 시키고
이 범주를 기준으로 실제 발생한 비율을 보고 이를 교정하겠다는 것이다.
다시말하자면, 예측한 값의 범주 중 실제 target의 비율을 시각화 한 그래프이다.
위 그림을 기반으로 설명을 해보자. 우선 학습한 모델의 예측값을 위 점의 개수인 10개의 범주로 등분한다.
등분한 범주 중 [0.4 ~ 0.6) 범주가 있다고 하자.
[0.4 ~ 0.6) 에 해당하는 범주의 비율을 계산한 경우 0.8의 비율이 나타났다고 하자.
이는 60%확률로 target이라고 예측하였지만 실제 비율은 80%라는 것을 의미한다.
따라서 모델이 과소 추정하였다고 할 수 있다.
이와 반대로 [0.6 ~ 0.75) 구간의 범주에서 모델은 0.75의 확률을 제시하였지만, 실제 비율은 0.6밖에 나타나지 않았다.
따라서 모델이 과대 추정하였다고 할 수 있다.
이렇게 Calibration curve를 통해 모델의 과대 과소 추정을 판단하고 이를 교정하거나 정량적으로 다룰 수 있다.
또한 Calibration Curve는 범주별로 신뢰구간의 extract binomial test를 기반으로 신뢰구간을 추정하여 제시할 수 있다.
끝으로 머신러닝모형을 validation data 를 기반으로 다시 재학습하는 방식으로 이를 교정하지 않을까 하는 생각이 든다.
'머신러닝' 카테고리의 다른 글
더미화?? 그것은 과연? (0) | 2020.09.06 |
---|---|
보루타(boruta algorithm) (0) | 2020.08.09 |
Dynamic Time Warping(동적 시간 접합) (0) | 2020.07.09 |
성능평가지표 (0) | 2020.04.26 |
과적합이 좋지 못한 이유? (0) | 2020.01.20 |
python package 생성
pip는 Python Package Index(PyPI)를 일컷는 약자로 파이썬 패키지를 관리하는 패키지 저장소이다.
우선 단계를 구분하자면
0. pypi 계정 생성, git 계정 생성
1. github repository 생성
2. 사용할 함수 및 폴더 구성
3. setup.py, __init__.py, README.md, setup.cfg, .gitignore, git init 생성
4. 등록
5. 사용
1. github repository
github 들어가서 아래처럼 Repository를 생성한다. 가급적 이름은 패키지랑 동일한게 좋으나 달라도 무방하다.
pca_cj 가 생성할 package name이며, 사용할 함수 및 폴더 구성은 다음과 같다.
<package name>
ㄴ<package name>
ㄴfunction1.py
ㄴfunction2.py
setup.py
from setuptools import setup, find_packages
setup(
# 배포할 패키지의 이름을 적어줍니다. setup.py파일을 가지는 폴더 이름과 동일하게 합니다.
name = 'pca_cj',
# 배포할 패키지의 버전을 적어줍니다. 첫 등록이므로 0.1 또는 0.0.1을 사용합니다.
version = '0.2',
# 배포할 패키지에 대한 설명을 작성합니다.
description = 'cor pca method generate',
# 배포하는 사람의 이름을 작성합니다.
author = 'changje.cho',
# 배포하는 사람의 메일주소를 작성합니다.
author_email = 'qkdrk7777775@gmail.com',
# 배포하는 패키지의 url을 적어줍니다. 보통 github 링크를 적습니다.
url = 'https://github.com/qkdrk7777775/pca_cj',
# 배포하는 패키지의 다운로드 url을 적어줍니다.
download_url = 'https://github.com/qkdrk7777775/pca_cj/archive/master.zip',
# 해당 패키지를 사용하기 위해 필요한 패키지를 적어줍니다. ex. install_requires= ['numpy', 'django']
# 여기에 적어준 패키지는 현재 패키지를 install할때 함께 install됩니다.
install_requires = [],
# 등록하고자 하는 패키지를 적는 곳입니다.
# 우리는 find_packages 라이브러리를 이용하기 때문에 아래와 같이 적어줍니다.
# 만약 제외하고자 하는 파일이 있다면 exclude에 적어줍니다.
packages = find_packages(exclude = []),
# 패키지의 키워드를 적습니다.
keywords = ['correlation matrix principal component analysis'],
# 해당 패키지를 사용하기 위해 필요한 파이썬 버전을 적습니다.
python_requires = '>=3',
# 파이썬 파일이 아닌 다른 파일을 포함시키고 싶다면 package_data에 포함시켜야 합니다.
package_data = {},
# 위의 package_data에 대한 설정을 하였다면 zip_safe설정도 해주어야 합니다.
zip_safe = False,
# PyPI에 등록될 메타 데이터를 설정합니다.
# 이는 단순히 PyPI에 등록되는 메타 데이터일 뿐이고, 실제 빌드에는 영향을 주지 않습니다.
classifiers = [
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.2',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
],
)
__init__.py : 내용은 없어도 무방하나 없으면 패키지가 설치가 안됨.
README.md : github에서 보여질 문서
# This Package is correlation matrix principal component analysis.
## package example1
cor pca use iris data
```
from sklearn.datasets import load_iris
import pandas as pd
df= load_iris()
df=pd.concat([pd.DataFrame(df.data),pd.Series(df.target)],axis=1)
df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']
df.tail()
X = df.iloc[:,0:4].values
y = df.iloc[:,4].values
#sklearn default is PCA(X,cor=False,cov_scaling=True,center=True)
finelDF,mean,std,matrix_w=PCA(X,cor=False,cov_scaling=False)
finelDF,mean,std,matrix_w=PCA(X,cor=True)
from matplotlib import pyplot as plt
fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1)
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
targets = [2, 1, 0]
colors = ['r', 'g', 'b']
for target, color in zip(targets,colors):
indicesToKeep = y== target
ax.scatter(finelDF[indicesToKeep ,0]
, finelDF[indicesToKeep ,1]
, c = color
, s = 50)
ax.legend(targets)
ax.grid()
#pca prediction
a=PCA(X[1:50],cor=False,cov_scaling=False)
#prediction
pred=(X[51:,:]-a[1]).dot(a[3])
```
## package example2
```
#sklearn kernel PCA method but scale is diffrence
X, y = make_moons(n_samples=100, random_state=123)
X_skernpca ,lambdas= kernel_PCA(X,n_components=2, gamma=15,scaling=False)
plt.scatter(X_skernpca[y == 0, 0], X_skernpca[y == 0, 1],
color='red', marker='^', alpha=0.5)
plt.scatter(X_skernpca[y == 1, 0], X_skernpca[y == 1, 1],
color='blue', marker='o', alpha=0.5)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.tight_layout()
plt.show()
```
setup.cfg
[metadata]
description-file = README.md
.gitignore : 깃 등록시 무시되게 설정해주는 파일.
# vscode
.vscode/
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
git init
git add .
git commit -m 'repo init'
git remote add origin http://github.com/<깃계정>/<패키지명>.git
git push -u origin master
패키지 등록을 위해 3가지 패키지가 요구
setuptools, wheel, twine
pip install setuptools wheel twine
python setup.py bdist_wheel
명령어 실행시 파일이 생성 되는데 dist 경로를 확인
twine upload dist/pca_cj-0.2-py3-none-any.whl
이제 pip install pca_cj로 다운로드 받아 실행하면되며,
python에서는
from pca_cj import <function명>의 형태로 사용하면 된다.
만약 도중에
fatal: remote origin already exists 란 애러가 발생할 시
git remote rm origin 를 사용하여 remote origin을 제거하고 다시 진행하면 설치 될 것이다.
참고 : https://doorbw.tistory.com/225
'python' 카테고리의 다른 글
matplotlib 시각화 정리 [여러 그림 그리기, quiver plot] (0) | 2020.11.05 |
---|---|
pypy (0) | 2020.08.31 |
python gridSearch, RandomSearch (0) | 2020.07.30 |
명령프롬프트로 anaconda 열기 (0) | 2020.07.01 |
pandas-profiling (0) | 2020.06.11 |
보루타(boruta algorithm)
보루타 알고리즘은 Random Forest를 기반으로 변수를 선택하는 방법이다.
보루타의 알고리즘 아이디어는 다음과 같다.
"기존 변수를 복원추출해서 만든 변수(shadow) 보다 모형 생성에 영향을 주지 못했다고 하면 이는 가치가 크지 않은 변수이다."
이를 좀 더 알고리즘적으로 말하자면
1. 기존변수와 기존변수를 복원추출해 만든 RandomForest 모형을 생성
2. 생성된 모형의 변수중요도를 기준으로 복원추출해 만든 변수들의 변수중요도 중 최대 값을 기준으로 기존변수와 비교
3. 비교 결과 최대 값 보다 큰 기존변수의 hit수를 1증가
4. Tentative에 해당하는 변수를 확률이 0.5이고 시행횟수가 run인 hit-1보다 큰 누적확률 값을 본페로니 교정을 통한 p-value로 유의수준(default = 0.01)보다 낮으면 Tentative 값을 accept로 변환
5. Tentative에 해당하는 변수를 확률이 0.5이고 시행횟수가 run인 hit보다 작은 누적확률 값을 본페로니 교정을 통한 p-value로 유의수준(default = 0.01)보다 낮으면 Tentative 값을 reject로 변환
6. Tentative에 해당하는 변수가 하나도 없거나 run횟수가 maxrun을 넘을 때까지 위 알고리즘을 반복
- 본페로니 교정은 default이며 옵션으로 변경 가능, Max run의 default는 100, doTrace를 기준으로 정밀도 및 알고리즘이 조금씩 상이해짐.
아래는 R에 나오는 보루타 알고리즘의 예제이다.
3번째 변수는 12번째 시행에서 기각되었으며, 2번째 변수는 16번째, 최종적으로 V6가 기각되었음을 boruta.Ozone값과 ImpHistory를 통해 알 수 있다.
library(Boruta)
data("Ozone")
ozone <- na.omit(Ozone)
summary(ozone)
set.seed(42)
Boruta.Ozone <- Boruta(V4 ~ ., data = ozone, ntree = 500,doTrace=0)
Boruta.Ozone$ImpHistory
plot(Boruta.Ozone)
'머신러닝' 카테고리의 다른 글
더미화?? 그것은 과연? (0) | 2020.09.06 |
---|---|
calibration Curve (0) | 2020.08.19 |
Dynamic Time Warping(동적 시간 접합) (0) | 2020.07.09 |
성능평가지표 (0) | 2020.04.26 |
과적합이 좋지 못한 이유? (0) | 2020.01.20 |
파랑, 풍랑 그리고 너울
파랑 : 바람에 의해 발생한 풍랑과 너울을 종합적으로 이르는 말
- 파고(wave height), 파장(wave length), 주기(wave period)로 구분
- 바람이 강하게 불 때는 풍랑과 너울을 구분하기 힘듬.
풍랑 : 해상에서 바람에 의해 발생하는 파도를 의미
- 바다에서 바람이 해수면 위를 지속적으로 불 때 발생
너울 : 풍랑이 바람이 부는 지역을 벗어나 더 이상 발달하지 않고 감쇄하는 형식의 파도를 의미
파랑의 특성
바람이 막 불기 시작하면 짧은 주기의 표면파, 파고가 높아지면 장주기의 파로 변환
풍랑의 마루는 뾰족한 편이며 파장과 주기가 짧다는 특징을 지님.
파고(wave height) : 파곡에서 파봉에 이르는 연직거리를 의미
파장(wave length) : 파봉에서 파봉, 혹은 파곡에서 파곡에 이르는 거리
주기(wave period) : 파봉에서 파봉, 혹은 파곡에서 파곡이 한 지점을 통과하는 시간
파속(wave celerity, wave speed) : 파장을 주기로 나눈 속도
유의파고 : 임의 시간동안 발생한 파고 중 파고가 높은 순서로 1/3에 해당하는 것까지의 파고들의 평균을 의미
참고
'그 외' 카테고리의 다른 글
병렬 프로그래밍 용어 정리 (0) | 2020.06.11 |
---|---|
인터넷 속도 올리기 (0) | 2020.02.01 |
[R] 재미삼아 푸는 문제 (0) | 2020.01.15 |
지도 그림 그리기 예제 (0) | 2019.11.11 |
[주식] 키움 영웅문 통한 주식 자료다운로드 (0) | 2019.11.11 |