티스토리 뷰

1. Outlier

- novelty detection : 새로운 값이 들어왔을 때, 그 값이 기존의 분포에 적합한 값인지 아닌지를 구별해 내는 방법
- outlier detection  : 현재 가지고 있는 값들 중에서 이상치를 판별해는 방법

종류 구분 설명
One-class SVM Novelty  Novelty를 위한 방법론으로 처음 관측 분포의 윤곽선을 새로운 차원 공간에 그려 놓고 추가 관측치가 경계로부터 구분된 공간 내에 있으면 초기 관측치와 같은 집단, 그렇지 않으면 비정상 데이터라고 간주한다. 
Fitting an elliptic envelope Outlier  이 방법론은 데이터 분포에 대한 가정이 필요하다. inlier 데이터가 가우스 분포라고 가정하면 inlie 위치 및 공분산을 추정할 수 있다. 이렇게 얻은 Mahalanobis distances는 외도 측정을 유도하는데 사용한다. 
Scikit-learn은 객체 공분산을 제공한다. 강력한 공분산 추정치를 데이터에 적용하여 타원을 중앙 데이터 포인트에 맞춰 중앙 모드 외부의 점을 무시하는 방법으로 Outlier를 제거할 수 있다. 
Isolation Forest Outlier  다차원 데이터셋에서 효율적으로 작동하는 아웃라이어 제거 방법이다. Isolation Forest는 랜덤하게 선택된 Feature의 MinMax값을 랜덤하게 분리한 관측치들로 구성된다. 
재귀 분할은 트리 구조로 나타낼 수 있으므로 샘플을 분리하는 데 필요한 분할 수는 루트 노드에서 종결 노드까지의 경로 길이와 동일하다. 
이러한 무작위 Forest에 대해 평균된이 경로 길이는 정규성과 결정의 척도가 된다. 
이상치에 대한 무작위 분할을 그 경로가 현저하게 짧아진다. 따라서 특정 샘플에 대해 더 짧은 경로 길이를 생성할 때 아웃라이어일 가능성이 높다.
Local Outlier Factor Outlier 
알고리즘은 관측치의 비정상적인 정도를 반영하는 점수(로컬 아웃 라이어 계수)를 계산한다. 
주어진 데이터 포인트의 이웃에 대한 로컬 밀도 편차를 측정한 후 이웃들보다 밀도가 훨씬 낮은 샘플을 감지하는 것이다. 
실제로, 국부 밀도는 가장 가까운 k개의 이웃으로부터 얻어진다. 정상적인 인스턴스는 이웃과 유사한 로컬 밀도를 가질 것으로 예상되지만, 비정상적인 데이터는 훨씬 더 작은 국소 밀도를 가질 것으로 예상된다. 
LOF 알고리즘의 강점은 데이터 세트의 로컬 및 전역 속성을 모두 고려한다는 것이다. 비정상 샘플의 기본 밀도가 다른 데이터 세트에서도 성능이 뛰어나다. 표본이 얼마나 고립되어 있는가가 아니라 주위의 이웃에 대해 얼마나 고립되어 있는지를 판단하는 것이다.
# Isolation Forest Example
clf = IsolationForest(max_samples=1000, random_state=1) 

# fit 함수를 이용하여, 데이터셋을 학습시킨다. race_for_out은 dataframe의 이름이다. 
clf.fit(race_for_out) 

# predict 함수를 이용하여, outlier를 판별해 준다. 0과 1로 이루어진 Series형태의 데이터가 나온다. 
y_pred_outliers = clf.predict(race_for_out) 


# 원래의 dataframe에 붙이기. 데이터가 0인 것이 outlier이기 때문에, 0인 것을 제거하면 outlier가 제거된  dataframe을 얻을 수 있다. 
out = pd.DataFrame(y_pred_outliers) 
out = out.rename(columns={0: "out"}) 
race_an1 = pd.concat([race_for_out, out], 1) 


2. 스케일링
- 스케일링은 자료 집합에 적용되는 전처리 과정으로 모든 자료에 선형 변환을 적용하여 전체 자료의 분포를 평균 0, 분산 1이 되도록 만드는 과정이다.

종류 설명
StandardScaler 평균이 0과 표준편차가 1이 되도록 변환. 
RobustScaler 중앙값(median)이 0, IQR(interquartile range)이 1이 되도록 변환. //아웃라이어(이상치)의 영향을 최소화한 기법 
MinMaxScaler 최대값이 각각 1, 최소값이 0이 되도록 변환 
MaxAbsScaler 0을 기준으로 절대값이 가장 큰 수가 1또는 -1이 되도록 변환 
from sklearn.preprocessing import StandardScaler 

#Scaler Example
scaler = StandardScaler() 
scaler.fit(X) 
X_scaled = scaler.transform(X) 
np.mean(X_scaled), np.std(X_scaled) 

#-------------------------------------------------
from sklearn.preprocessing import RobustScaler

robust_scaler = RobustScaler()
robust_scaler.fit(X)
X_robust_scaled = robust_scaler.transform(X)
np.mean(X_robust_scaled), np.std(X_robust_scaled)

fit과 transform 과정을 합쳐서 fit_transform 메서드를 사용할 수 있다.



3. 파이프라인
전처리용 객체는 acikit-learn의 파이프라인(pipeline) 기능을 이용하여 분류 모형과 합칠 수 있다. 예를 들어 스케일러와 선형회귀모형은 다음처럼 합친다. 파이프라인으로 결합된 모형은 원래의 모형이 가지는 fit, predict 메서드를 가지며 각 메서드가 호출되면 그에 따른 적절한 메서드를 파이프라인의 각 객체에 대해서 호출한다. 예를 들어 파이프라인에 대해 fit 메서드를 호출하면 전처리 객체에는 fit_transform이 내부적으로 호출되고 분류 모형에서는 fit 메서드가 호출된다. 파이프라인에 대해 predict 메서드를 호출하면 전처리 객체에는 transform이 내부적으로 호출되고 분류 모형에서는 predict 메서드가 호출된다.

from sklearn.pipeline import Pipeline 
from sklearn.linear_model import LinearRegression 

#Pipeline Example
model = Pipeline([ 
    ('scaler', StandardScaler()), 
    ('regressor', LinearRegression()), 
])

 


참고

https://scikit-learn.org/stable/modules/preprocessing.html
https://mkjjo.github.io/python/2019/01/10/outlier.html

'Programming > Machine Learning' 카테고리의 다른 글

[Scikit-Learn] Cross-validation  (0) 2019.07.07
[Scikit-Learn] 환경 설정  (0) 2019.07.07
텐서플로우 Docker 설치  (0) 2019.05.16
선형회귀 (Linear regression)  (0) 2019.05.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함