기본 콘텐츠로 건너뛰기

12월, 2017의 게시물 표시

[ML] 결정트리(Decision Tree) 모델

16. Learning: Support Vector Machines

support vector machine_intro

SVM hyperplane(초평면) : 유한차원 공간에서 원 차원으로 부터 한 차원 낮은 부분공간을 의미합니다. 예를들면 3차원 공간 속 평면 공간을 의미합니다. 부분 벡터 공간 $N \subset V$ 에서 N을 V의 벡터 초평면(hyperplane)이라고 합니다. 서포트벡터머신(svm)은 기계학습 분야의 하나로 대표적인 지도학습의 분야 중 하나 입니다. 주로 분류(classification)과 회귀분석에 사용됩니다. 장점;  - 고차원 공간에서 효율적  - 샘플 수보다 큰 차원에서 효율적  - 결정함수(decision function, support vector)내에서 훈련  데이터들의 부분들을 이용(memory effect)  - 결정함수를 특정하기 위해 다른 커널 함수(kernel functions)들을 사용할 수 있습니다. 일반적인 커널 함수가 제공하되지만 사용자가 생성할 수 있습니다. 단점;  - 샘플의 수 > 변수의 수 --> 특정한 커널 함수를 선택하는 것으로 과적합을 피하여야 합니다. 그리고 데이터들의 정규화가 중요합니다.  - SVMs은 직접적으로 확률적 추정을 제공하지 않기 때문에 expensive five-fold cross-validation을 이용하여 계산합니다. scikit-learn내에 svm은 입력 데이터로 dense와 sparse sample vectors 형식을 지원합니다. dense : numpy.ndarray 와 numpy.asarray에 의해 이 형식으로 변환할 수 있습니다. sparse : scipy.sparse 분류 선형적으로 분리할 수 있는 데이터는 데이터의 원소들을 구별할 수 있는 무한히 많은 결정경계를 만들수 있습니다. 그러나 직관적의 어떠한 경계는 다른 것들보다 좀 더 명확한 경계선을 보일 것입니다. 위 그림은 원과 사각형의 점들을 구별하기 위해 3개의 선을 보인 것으로 선 1, 2, 3 중에 어떤 선을 선택해야 하는가를 찾는 것이 svm의 목적입니

axes and text_R plots

Axes and Text R에서 plot() 함수의 기본 형은 다음과 같습니다.  plot(x, y, main="제목", sub="하위제목", xlab=" ", ylab=" ", xlim=c(최소, 최대), ylim=c(최소, 최대), xlab, ylab, col.lab=축이름의 색, cex.lab=0.75) 위 함수의 매개변수 중 xlab. ylab은 축이름이고 xlim, ylim은 x, y 축의 범위를 나타냅니다.  cex.lab은 축이름의 크기를 지정합니다.  위 함수에서 재목은 title() 함수를 사용하여 별도로 나타낼 수 있습니다.  title(main="제목", col.main=제목의 색, sub="하위제목", col.sub="하위제목의 색") 그래프에 text를 첨가하기 위해 text()와 mtext()를 사용할 수 있습니다.  text(): 그래프 내에 문구를 첨가할 경우 사용합니다.    text(위치1, "삽입문구", 위치2, ...) mtext(): 그래프 외부에 위치시킬 경우 사용합니다.   mtext("삽입할 문구", side,...) 위치1 - x, y 축의 값을 지정하여 해당하는 좌표를 시작으로 문구가 삽입됩니다.  side(위치2) - 그래프 내 또는 외부에 위치를 지정합니다.       위치2 = 1, 2, 3, 4로 지정되면 각각은 below, left, above, right 이외에 cex, col, font를 지정할 수 있는데 각각은 크기, 색, 폰트 스타일을 지정할 수 있습니다.  축 설정  axis() 함수를 사용하여 축을 별도로 설정할 수 있습니다.  axis(위치2, at=, labels=, pos=, lty=, col=, las=, tck=,...) at: 지

linear regression_python

선형회귀는 회귀계수 w=(w1, w2, ..., wp)를 가진 선형모형을 생성하는 것입니다. 이는 반응변수의 관찰치와 선형 모형에 의한 추정치 사이의 잔차제곱합이 최소가 되도록 설정합니다. $$ \text{min} \sum^n_{i=1} {(x_i w- y_i)^2}$$ 회구모형을 구축하기 위해 sklearn 모듈을 사용하는데 제공되는 모든 함수는 list 또는 np.array 형을 대상으로 합니다. 그러므로 아래와 같이 pandas 모듈의 함수를 사용하여 엑셀로 부터 데이터를 호출하는 경우 호출되 데이터는 DataFrame 형태이므로 이들의 형식을 np.array 형으로 변경하여야 합니다. >>> import numpy as np >>> import pandas as pd >>> from datetime import datetime, timedelta >>> import matplotlib.pyplot as plt >>> from sklearn import linear_model >>> kl=pd.read_excel('C:\\~~.xlsx', sheet_name="kl") >>> startd=pd.Timestamp(datetime(2017,12, 1)) >>> kl1=kl.ix[kl.index>=startd, :] >>>  kl1              Open   High    Low  Close    Volume 2017-12-01  17550  17580  17345  17425   9696255 2017-12-04  17550  17750  17400  17750   8287180 2017-12-05  17610  17955  17530  17875   9387273 .... 위 데이터에서 Open, High, Low를 독립변수

회귀계수에 대한 F 검정

단변수에 대한 회귀검정 회귀 모형에서 독립변수 각각의 효과를 검정합니다. 2 단계로 이루어 집니다. 1) 독립변수와 관찰치 사이의 상관을 계산 $$\frac{(x-\ba x)(y-\bar y)}{\sigma_x \sigma_y}$$ 2) F score 즉, F 값과 대응되는 p value를 계산한다. F 검정은 정규분포를 따르는 모집단에서 분류된 집단의 분산이 동일하고 각 집단의 평균이 같다고 가정한다.  H0: 각 그룹의 분산은 같다. 회귀계수의 검정에서 각 변수는 그 회귀계수가 0일 경우 즉, 반응변수의 평균과의 잔차에 대한 분포와 독립변수가 사용될 때 추정치와의 잔차의 분포를 비교합니다.  다음의 독립변수(ind)와 반응변수(de)에 대해 F 검정의 결과는 regression_f() 메소드를 적용합니다. 이 메소드는 sklearn.feature_selection클래스 메소드입니다. >>> from sklearn import feature_selection >>> ind array([[ 17550.,  17580.,  17345.],        [ 17550.,  17750.,  17400.],        [ 17610.,  17955.,  17530.],        [ 17890.,  17905.,  17370.],        [ 17445.,  17470.,  17135.],        [ 17365.,  17445.,  17230.],        [ 17395.,  17425.,  17225.],        [ 17400.,  17405.,  17205.],        [ 17300.,  17555.,  17215.],        [ 17575.,  18010.,  17550.],        [ 17710.,  17785.,  17455.],        [ 17580.,  17630.,  17485.],        [ 17685.,  17885., 

pandas DataFrame 객체의 호출방법

함수 내용 df[열이름], df[ [열이름1, 열이름2, ...] ] 열선택 , 다중의 열을 호출할 경우 호출할 열이름은 하나의 인자가 되어야 하므로 리스트([])로 묶어 표현해야 합니다. df.loc[행이름, 열이름] 라벨에 의한 행, 열 선택 df.iloc[정수형태로 행, 열] 위치를 나타내는 정수에 의해 행 선택 df.ix[행, 열] 행과 열을 지정하여 값을 호출, 이 메소드에 행과열은 이름 뿐 아니라 위치를 나타내는 정수 역시 가능합니다.(이 방법은 호출방식에서 제거 될 예정이므로 지양하는 것이 좋습니다.) >>> x              Open   High    Low  Close    Volume 2017-12-15  17710  17785  17455  17520   8021471 2017-12-18  17580  17630  17485  17585   5329171 2017-12-19  17685  17885  17500  17585   8411805 2017-12-20  17500  17670  17490  17520   4540009 2017-12-21  17430  17485  16840  16840  15900848 >>> x["Close"] Out[205]: 2017-12-15    17520 2017-12-18    17585 2017-12-19    17585 2017-12-20    17520 2017-12-21    16840 Name: Close, dtype: int64 >>> x.loc['2017-12-20', "Close"] 17520 >>> x.iloc[3, 2] 17490

회귀분석을 위한 주가데이터 만들기2_ DataForRegressionS

포스트 DayInInterRetStockS() 의 클래스를 소개하는 글에서 원 일일주가데이터로 부터 새로운 변수들을 생성하여 새로운 객체를 만들었습니다. 그 결과를 바탕으로 회귀분석을 위한 데이터 생성을 계속해 보면 다음과 같습니다.  이전의 데이터 경향으로 새로운 값을 예측하는 것이 회귀분석의 기본방향이라면 위에서 생성된 데이터들 중에 예측에 사용되는 변수들(독립변수)과 예측을 위한 변수(반응변수)를 구분해야 겠지요. 이전에 생성한 객체의 변수명은 다음과 같습니다.  >>> da.columns Index(['Open', 'High', 'Low', 'Close', 'Volume', 'Close:Open:ret',        'Close:High:ret', 'Close:Low:ret', 'Open:intRet', 'High:intRet',        'Low:intRet', 'Close:intRet', 'Volume:intRet', 'olag', 'hlag', 'llag',        'clag', 'vlag'],       dtype='object') 위의 변수들 중에 반응변수의 대상은 'Open', 'High', 'Low', 'Close'중의 하나의 변수가 될 것입니다.  예로서 Close를 반응변수로 한다면 나머지 변수들은 독립변수가 됩니다. 독립과 반응변수는 날들로 모형의 설계는  '당일까지의 독립변수들의 성격들로 다음날의 반응변수를 예측' 으로 구축할 것입니다.  이러한 구축을 위해 먼저 독립변수들과 반응변수를 구분하고 이 두 대상의 날짜를

회귀분석을 위한 주가데이터 만들기_DayInInterRetStockS 해설

일일주가 데이터에서 지정한 열을 기준으로 일중 수익률, 일간 수익률, 그리고 지정한 일전(preday)의 자료와 결합합니다. 목표한 자료를 위해 사용자 정의 클래스를 작성하였습니다. import numpy as np import pandas as pd import copy class DayInInterRetStockS:     def __init__(self, da):         self.da=da         self.nme=[i for i in self.da.columns]     def InRetS(self, DeColN):         nme0=copy.deepcopy(self.nme)         nme1=self.nme[DeColN]         del(nme0[DeColN])          nme2=[ ]         for i in nme0:             nme2.append(nme1+":"+i+":ret")             m=0         re=pd.DataFrame()         for j in nme0:             re[nme2[m]]=(self.da[nme1]-self.da[j])/ self.da[j] *100             m=m+1         self.Inday=re.drop(nme2[len(nme2)-1], axis=1)         return(self.Inday)     def IntRetS(self, Int=1):         nme1=[i+':intRet' for i in self.nme]         self.intrad=((self.da-self.da.shift(Int))/self.da.shift(Int)*100)         self.intrad.columns=nme1         return(self.intrad)     def ShiftdS(self

stock data의 정규 분포의 적합성_bootstrap, CLT

중심극한정리를 사용하여 최근 60일 또는 30일간의 일일자료를 바탕으로 자료의 수를 증가시켜 회귀모형을 작성합니다. 우선 이 자료가 정규분포 또는 로그노말 분포에 적합성을 확인합니다. 1. 자료 호출 (대상은 코덱스 레버리지) 엑셀에 보관된 자료를 호출합니다. >>> import numpy as np >>> import pandas as pd >>> from datetime import datetime, timedelta >>> kl=pd.read_excel('C:\\~~\\newD1.xlsx', sheet_name="kl") 호출한 자료 중에서 일정한 날짜 이후의 데이터를 추출합니다. 이 경우 사용될 수 있는 date 자료형은 pd.Timestamp를 사용하여 입력된 숫자형 타입을 date형으로 전환합니다. >>> startd=pd.Timestamp(datetime(2017,9,20)) >>> kl1=kl.ix[kl.index>=startd, :] >>> len(kl1) #데이터 프레임 형에서 행의 수를 나타냅니다.  60 위의 자료의 정규성 검사를 위해 QQ plot과 pearson 상관검정을 실시해 봅니다. >>> from scipy import stats >>> g=plt.subplot(111) >>> x=stats.probplot(kl1.ix[:,3], dist="norm", plot=g) >>> plt.show() 위의 객체 x에서 생성된 두 결과 객체 즉, 위 그림의 ordered Value(x[0][1])과 Theoretical quanties(x[0][0]) 사이의 상관분석을 실시해보면 다음과 같은 결과가 나타납니다. >>> stats.pearso

다중 그래프 그리기 (ing)

subplot()함수를 사용합니다. 이 함수에는 3개의 정수를 전달합니다. 예로 subplot(abc); a*b는 그래프의 배열을 의미합니다. 즉, a=row, b=column c는 그래프의 번호 입니다.  >>> g1=plt.subplot(121)  >>> n, b, ig=g1.hist(trg, bins=int, normed=True, alpha=0.3)  >>> mu=np.mean(trg)  >>> sd=np.std(trg)  >>> g1.plot(b, norm.pdf(b, mu, sd), color="r", linewidth=2)  >>> g2=plt.subplot(122)  >>> x=stats.probplot(trg, dist="norm", plot=g2)  >>> plt.show() 위의 예는 1행 2열로 배치하여 왼쪽 부터 그림의 번호가 1,2번입니다.

Pearson 상관분석_R, python

- 개요 상관분석은 두 변수의 관계를 [-1, 1] 사이의 값으로 나타냅니다. 분석시 데이터들의 스케일에 차이로 영향을 받기 때문에 이에 조정이 필요합니다. 이 분석에는 다양한 방법이 있지만 대표적 모수 방법인 Pearson 상관분석에 대해 알아봅니다. 이 방법은 공분산은 두 변수의 표준편차로 나누어 [-1, 1]의 범위에서 대응되는 상관계수를 계산합니다. 두 변수 x, y의 공분산은 다음과 같습니다. $$\text{cov(x, y)} = \frac{\sum^n_{i=1} (x_i -\bar{x})(y_i - \bar{y})}{n-1}$$ 위 식에서 $\bar{x}$, $\bar{y}$는 변수 x, y의 평균입니다. n은 각 변수의 변수 갯수입니다. 이 분석에 각 변수의 갯수는 동일해야 합니다. 이 결과를 바탕으로 pearson 상관계수는 다음과 같이 계산됩니다. $$ \text{cor (x, y)} = \frac{\text{cov(x, y)}{\sigma_x |sigma_y}$$ 위의 계산은 프로그램 R과 python을 사용하여 다음과 같이 계산됩니다. - R 계산에 사용할 변수들은 다음과 같습니다. x<-c(-2.27390067, ..., 2.27390067) y<-c(16340, ..., 18965) > cor.test(x, y) Pearson's product-moment correlation data:  x and y t = 43.65, df = 58, p-value < 2.2e-16 alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval:  0.9751144 0.9911187 sample estimates:       cor 0.9851183 이 분석결과는 매우 높은 상관계수를 보입니다.  이 분석은 t분포를 근거로 하고 있으며 자유도(df), p-value를 나타내

google spreadsheet에서 주가자료 호출하기

google finance에서 방대한 양의 주가자료를 제공하고 있습니다. 그러나 일부자료는 그래프만 제공되며 데이터를 볼수도 다운받을 수도 없습니다. 물론 python 패키지 를 사용하면 쉽게 자료를 호출하여 저장할 수 있습니다.  그러나 r의 경우   kosdaq군의 자료를 다운받을 수 없습니다. 이 경우 google spreadsheet에서 제공하는 다음 함수를 사용하면 자료의 호출이 용이하게 이루어 집니다. 물론 다운 받은 자료를 엑셀이나 csv 파일로 전환해야 하는 번거로움이 존재합니다. googlefinance("종목코드", "다운받을 항목", "시작날짜", "마지막날짜", "DAILY" 또는 "WEEKLY") 다운받을 항목으로 아래의 결과에와 같이 open, high, low, close, volume등이 있으며 이외에도 다양한 인수들이 존재합니다. KOSDAQ:KOSDAQ open Date Open Date High Date Low Date Close Date Volume high 2013. 1. 2 오후 3:30:00 501.75 2013. 1. 2 오후 3:30:00 501.86 2013. 1. 2 오후 3:30:00 499.2 2013. 1. 2 오후 3:30:00 501.61 2013. 1. 2 오후 3:30:00 342534000 low 2013. 1. 3 오후 3:30:00 504.64 2013. 1. 3 오후 3:30:00 504.76 2013. 1. 3 오후 3:30:00 498.98 2013. 1. 3 오후 3:30:00 499.07 2013. 1. 3 오후 3:30:00 388426000 close 2013. 1. 4 오후 3:30:00 500.27 2013. 1. 4 오후 3:30:00 504.85 2013. 1. 4 오후 3:30:00 499.44 2013. 1. 4 오후 3:30:0

plot_line type:R

R에서 그래프를 작도할 경우 다양한 선택요소가 있습니다. 다음은 그래프에서 데이터들의 위치나 경향을 나타내기 사용하기 위한 인자들입니다. 종류 설명  p 점 표시  l 선 표시 o 점위에 선을 표시  b 점들 사이에 선을 표시  c 점위치에는 공백이고 나머지는 선으로 표시  s 계단식으로 표시(시작을 수평으로) S 계단식으로 표시(시작을 수직으로) h 막대그래프로 표시 n 아무것도 표시하지 않음  단순한 그래프로서 여러가지 종류를 나타낸 것입니다. > h<- 1:10 > f<-50*9.8*h > typ<-c("p","l","o","b","c","s","S", "h", "n") > par(mar=c(4,4,1,1)) > par(mfrow=c(2,2)) > for (i in typ){ +   plot(h, f, xlab="높이(m)", ylab="힘(N)", type=i) +   legend(2, 4000, legend=i) + }

Log-normal distribution의 소개

확률이론에서 로그노말분포는 어떤값들의 로그화가 정규분포에 부합하는 랜덤변수의 연속확률분포입니다. 즉, 변수 X가 로그노말 분포를 따른다면 Y=ln(X)는 노말분포에 부합합니다. 반대로 Y가 정규분포를 따른다면 X=exp(Y)는 로그노말분포를 가집니다. 로그노말분포를 따르는 랜덤변수는 양의 실수이어야 하겠지요. 로그노말분포의 랜덤변수들은 양의 독립적 변수들의 곱셈으로 얻어지는 값들에서 나타납니다. 많은 데이터를 정규분포와의 비교에서 크거나 작은 왜도에 의해 이탈되는 경우가 많이 발생합니다. 왜도 분포는 평균이 낮거나 분산이 크거나 그 값들이 음수일 경우에 자주 발생합니다. 이러한 분포는 log normal 분포에 근접한 경우가 자주 발생합니다. 어떠한 효과가 첨가적(additive)으로 일어나는 경우 정규분포, 곱셈효과(multiplicative effect)일 경우는 로그노말분포를 따르는 경우가 많습니다. 다음은 첨가효과를 보기위해 주사위를 두개를 시행한 후 더한값의 분포를 정규분포와 비교해 보았습니다. import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.pyplot as plt x=np.random.randint(1, 7, size=10000) y=np.random.randint(1, 7, size=10000) z=x+y bi=np.linspace(1, 13, 12) n, bins, ig=plt.hist(z, bi, normed=True, linewidth=0.5, edgecolor="k") mu=np.mean(z) sd=np.std(z) plt.plot(bins, tats.norm.pdf(bins, mu, sd), color='r', linewidth=2) plt.show() 위 분포는 다음의 모수를 가진 정규분포에 부합하는 것을 알 수 있습니다.  (위 코드

bar chart의 color 표시

매개변수 color를 사용합니다. >>> import numpy as np >>> import matplotlib.pyplot as plt >>> x=np.arange(4) >>> y=np.random.randint(0, 10, size=8).reshape(4,2) >>> plt.barh(x, y[:,0], color="r") >>> plt.barh(x, -y[:,1], color="b") >>> plt.barh(x, y[:,0], color="k", edgecolor='r') >>> plt.barh(x, -y[:,1], color="w", edgecolor='b') 다음은 여러개의 막대그래프를 색의 농도에 의해 구별해 봅니다.  >>> col=[str(i) for i in np.abs(np.random.randint(100, size=100))/100] >>> plt.bar(np.arange(100), np.random.randint(100, size=100), color=col) 위 그래프에서 col을 정렬하여 나타냅니다.  >>> plt.bar(np.arange(100), np.random.randint(100, size=100), color=np.sort(col))

R 함수들을 사용한 주가자료 호출

내용 get.hist.quote() getSymbols() R tseries패키기를 사용하여 주가자료 호출 호출한 자료의 경우 결측치 가 포함되어 있으면 경고메시지가 발생됩니다. 그러므로 호출된 자료를 사용하기 전에 반드시 결측치 관리를 해야 합니다. na.omit(), na.approx(), na.fill() 등의 함수를 사용할 수 있습니다. get.hist.quote() tseries 패키지의 함수 get.hist.quote()를 사용합니다. get.hist.quote(instrument= 종목코드, start, end, quote =c("Open", "High", "Low", "Close", "Volume"),~) start, end는 각각 호출할 자료의 시작과 마지막 날짜로서 문자형으로 전달합니다. > get.hist.quote("^KS11", "2022-09-28", "2022-10-01", quote=c("Open","High","L$ time series ends 2022-09-30 Open High Low Close Volume 2022-09-28 2206.15 2223.56 2151.60 2169.29 595700 2022-09-29 2197.75 2210.61 2170.14 2170.93 508200 2022-09-30 2161.11 2177.20 2134.77 2155.49 950000 getSymbols() quantmod 패키지의 getSymbols() 함수를 적용합니다. getSymbols(코드, from=시작날짜, to= 마지막날짜, auto.assign=F) > getSymbols('^KS11', from='2022-09-