티스토리 뷰
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
- guava
- java Equals
- RetryTemplate
- SmartLifecycle
- 복합키 Mapping
- JPA
- java EqualsAndHashCode
- Discriminate Mapping
- Spring Registrar
- Join Table
- JPA Criteria
- Property
- Mapping
- Registrar
- Query DSL
- Charles proxy
- Typesafe Config
- Embedded Mapping
- docker
- java generic
- Criteria
- @Primary
- DI
- scikit-learn
- Akka
- Spring
- spring spel
- Spring JDBC Template
- Sprint RetryTemplate
- Embeddable Mapping
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |