[머신러닝] 전처리 (pre-processing)
전처리는 데이터 분석에 적합하게 데이터를 가공, 변형, 처리, 클리닝하는 과정입니다. 데이터가 깔끔하지 않으면
그만큼 이를 처리하는 모델의 성능이 좋지 못한 경우가 많습니다. 그렇기에 머신러닝 학습 전에 전처리를 해야 합니다.
실제로 분석가의 80% 시간을 데이터 수집 및 전처리에 사용하고 있습니다.
[pandas] 데이터 전처리 를 학습하고 오시기 바랍니다.
결측치 NULL
데이터에서 .isnull( ) 또는 .isna( ) 함수를 사용해 쉽게 결측값을 찾을 수 있습니다.
만일 결측값의 갯수를 구하려면 .isna( ).sum( ) 을 사용하면 됩니다.
또한 dataFrame['칼럼명'].isnull( ) 을 하게 되면 해당 칼럼 값들만 찾을 수 있습니다.
이렇게 찾은 결측값은 .fillna( 변경값 ) 함수로 해당 결측값을 바꿀 수 있었습니다.
sklearn에서는 이를 Simplelmputer 클래스를 사용하여 처리할 수 있습니다.
Simplelmputer
Simplelmputer 클래스는 누락 데이터(NaN) 데이터를 대체하는데 사용됩니다.
객체를 생성할 때 인자값을 줄 수 있는데.
strategy = '처리방법' 을 지정할 수 있습니다. 처리 방법으로는 'mean', 'median', 'most_frequent', 'constant' 가 있습니다.
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean') # 객체 생성
imputer.fit(df[['Age', 'Pclass']]) # fit으로 결측치 학습
result = imputer.transform(df[['Age','Pclass']]) # 실제 결측치 처리값
df[['Age', 'Pclass']] = result # 전처리 진행
.fit( ) 함수로 결측값을 학습시키고 .transform( ) 함수로 실제 결측값을 처리한 값을 얻을 수 있습니다.
이 과정을 한번에 하기 위해 fit_transform( ) 함수를 사용할 수 있습니다.
result = imputer.fit_transform(df[['Age','Pclass']]) # 학습,처리 동시진행
df[['Age', 'Pclass']] = result
인코딩 (encoding)
머신러닝의 학습을 위해서는 모든 데이터가 수치 데이터여야 합니다.
이 때문에 모든 문자 데이터는 변환될 필요가 있습니다. (ex 남자 = 1 여자 = 0)
LabelEncoder
LabelEncoder 클래스는 문자열로 표현된 클래스 레이블을 숫자형으로 인코딩해줍니다.
Simplelmputer 클래스와 마찬가지로 fit으로 학습하고 transform으로 처리를 수행합니다.
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder() # 객체 생성
df['Sex'] = encoder.fit_transform(df['Sex'])
위와 같이 fit_transform 함수를 쓰면 매우 깔끔하게 처리를 할 수 있습니다.
.value_counts() 함수를 사용하여 값을 확인해 보겠습니다.
만일 인코딩한 클래스 레이블에 대한 원본 클래스를 확인하려면 .classes_ 로 확인할 수 있습니다.
다시 디코딩 할때는 .inverse_transform([ ])를 하시면 됩니다.
원 핫 인코딩 (One Hot Encoding)
원-핫 인코딩(One-Hot Encoding)은 범주형 변수(categorical variable)를 수치형 데이터로 변환하는 방법입니다.
pd.get_dummies( )
pd.get_dummies(df['Embarked']) # 탑승 항구를 원 핫 인코딩 처리
피처 스케일링 (feature scaling)
피처 스케일링은 특성(feature)의 크기를 맞추는 전처리(preprocessing) 기법 중 하나입니다. 머신 러닝 알고리즘을 사용하여 데이터를 분석할 때, 특성의 크기(단위)에 따라 영향도가 달라질 수 있습니다.
예를 들어 네이버 영화 평점은 0~10 까지의 범위를 갖지만, 넷플릭스 영화 평점은 0~5 까지의 범위를 갖습니다.
당연히 똑같이 5의 값이 들어가도 의미는서로 다를 것 입니다. 이를 정규화 시켜보겠습니다.
# 점수 생성
movie = {'naver' : [2,4,6,8,10],
'netflix' : [1,2,3,4,5]}
movie = pd.DataFrame(movie)
정규화 (Normalize)
column 간에 다른 min, max 값을 가지는 경우, 최소치 / 최대값의 척도를 맞추어 줍니다 ( 최소값 = 0, 최대값 = 1)
(x - min(x)) / (max(x) - min(x))
MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
nl = MinMaxScaler()
nl.fit_transform(movie)
표준화 ( Standard Scaling , Z - score )
표준화는 특성들의 평균이 0, 표준편차가 1이 되도록 변환합니다. (x - mean(x)) / std(x)
StandardScaler
from sklearn.preprocessing import StandardScaler
ss = StandardScaler() # 객체 생성
ss.fit_transform(movie)