#install as:
pip install category_encoders
from category_encoders import OneHotEncoder
enc = OneHotEncoder()
enc.fit_transform(X_train)
종류 | 특징 |
---|---|
OneHotEncoder | 순위·순서가 없는 범주형 변수일 때 사용 |
OrdinalEncoder | 순위·순서가 있는 범주형 변수일 때 사용 |
TargetEncoder | 높은 카디널리티의 범주형 변수일 때 사용 |
df.isnull() # 결측치 확인
df.isnull().sum() # 컬럼별 결측값 개수 확인
df.fillna(0) # 결측값을 0으로 대체
df.fillna(df.mean()) # 결측값을 변수별 평균으로 대체
df.dropna() # 결측값이 포함된 행 제거
from sklearn.impute import SimpleImputer
imp = SimpleImputer(strategy='mean') # strategy(대체값 파라미터)= mean, median, most_frequent, constant
imp.fit_transform(X_train)
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.datasets import load_iris
# 데이터셋 불러오기
iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['target'] = iris.target
# boxplot으로 이상치가 있는지 판단
sns.boxplot(y = "sepal width (cm)", data = df);
# outlier 제거
def get_outlier(df, column, weight):
quantile_25 = np.percentile(df[column].values, 25)
quantile_75 = np.percentile(df[column].values, 75)
IQR = quantile_75 - quantile_25
IQR_weight = IQR * weight
lowest = quantile_25 - IQR_weight
highest = quantile_75 + IQR_weight
outlier = df[column][ (df[column] < lowest) | (df[column] > highest) ].index
return outlier
outlier = get_outlier(df, 'sepal length (cm)', 1.5)
df.drop(outlier, axis=0, inplace=True)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit_transform(X_train)
종류 | 설명 |
---|---|
StandardScaler | 각 feature의 평균을 0, 분산을 1로 변경 |
MinMaxScaler | 최소/최대값이 각각 0, 1이 되도록 변경 |
MaxAbsScaler | 최대 절대값이 1이 되도록 변경 |
RobustScaler | 중앙값(median)과 IQR(interquartile range)을 사용하여 변경 |
# Random Forest 모델
RandomForestClassifier(class_weight='balanced') # class_weight [default=None]
# XGBoost 모델
XGBClassifier(scale_pos_weight='balanced') # scale_pos_weight [default=1]
데이터 자체를 증가시키는 방법이다.
df_majority = df[df.balance==0]
df_minority = df[df.balance==1]
df_minority_upsampled = resample(df_minority, replace=True, n_samples=df_majority.shape[0], random_state=123)
df_upsampled = pd.concat([df_majority, df_minority_upsampled])
데이터 자체를 감소시키는 방법이다.
df_majority = df[df.balance==0]
df_minority = df[df.balance==1]
df_majority.shape, df_minority.shape
df_majority_downsampled = resample(df_majority, replace=False, n_samples=df_minority.shape[0], random_state=123)
df_downsampled = pd.concat([df_majority_downsampled, df_minority])
data에 imbalance가 존재하는 경우, 단순 accuracy_score을 확인하는 것이 아닌 AUC, sensitivity, specificity를 확인해야 한다.
def evaluate(model, X, y):
predictions = model.predict(X)
accuracy = accuracy_score(predictions, y)
tn, fp, fn, tp = confusion_matrix(y, predictions).ravel()
sensitivity = tp / (tp+fn)
specificity = tn / (tn+fp)
auc = roc_auc_score(y, predictions)
print("AUC: ", auc)
print("Sensitivity: ", round(sensitivity,2))
print("Specificity: ", round(specificity,2))
return round(accuracy,2)
evaluate(clf_0, X, y)
머신러닝 알고리즘을 작동하기 위해 데이터에 대한 도메인 지식을 활용하여 특징(Feature)를 만들어내는 과정이다.
중복 코드를 최소화여 쉽게 연결할 수 있다.
pipe = make_pipeline(
OneHotEncoder(),
SimpleImputer(),
StandardScaler(),
LogisticRegression(n_jobs=-1)
)
pipe.fit(X_train, y_train)
pipe.named_steps # 스텝별 파라미터 등 정보 확인