to_frame(), display(), standardscaler, OneHotEncoder(), knnimputer, dendrogram, missingno, re, fit_transform(), rename()목차
<참고 kaggle >
Titanic_model_with_98%_accuracy (kaggle.com)
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import klib
import plotly_express as px
import missingno as mogn
import warnings
from dash import Dash,dcc,html,Input,Output
from dython.nominal import associations
warnings.filterwarnings('ignore')
from sklearn.preprocessing import OneHotEncoder
#First we will used KNNImputer
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import KNNImputer,SimpleImputer
from feature_engine.wrappers import SklearnTransformerWrapper
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.impute import IterativeImputer
1. to_frame()
series 객체에서만 사용
series를 dataframe 데이터프레임으로 변환하는데 사용.
2. .T transpose
트랜스포즈라고 부른다. 데이터프레임의 행과 열을 바꿔준다.
3. display()
데이터프레임을 보기 좋게 출력하는데 유용하다.
print() 함수 대안이 될 수 있으며, dataframe, series 같은 판다스 객체를 출력할 때 더 깔끔한 결과를 제공한다.
#check the value of rows
for col in train_df.select_dtypes('object'):
display(train_df[col].value_counts().to_frame().T)
4. 타입힌트
- 데이터 컬럼별 결측값 찾기 사용자함수
사용자함수에서 인수로 받는 부분에 : 콜론 표시가 있다.
이것은 파이썬3.5버전이상에서 사용할 수 있는 것으로,
타입힌트라고 불린다.
함수의 인자나 반환값이 어떤 타입이어야 하는지 명시적으로 지정하는 기능이다.
def missing_value(train_df:pd.DataFrame):
"""null 값 찾기 """
missing_train_df=train_df.isnull().sum()
total_record=train_df.shape[0]
perc_missing=round((missing_train_df/total_record)*100,3)
missing_train_df=pd.DataFrame(data={'columns_name':missing_train_df.index,
'num_missing':missing_train_df.values,
'perc_missing':perc_missing.values})
return missing_train_df.sort_values(by='perc_missing',ascending=False)
missing_value(train_df)
위의 경우에서 missing value의 인수는 train_df를 예시로, dataFrame 타입이어야 함을 나타낸다.
이런 타입힌트를 통해 코드의 가독성을 높인다.
5. klib 라이브러리
전처리에 유용한 함수
missingval_plot 데이터셋 결측치 시각적 분석
import klib
klib.missingval_plot(test_df)
6. dendrogram
★ missingno는 결측 데이터를 시각화, 분석하는데 도움주는 라이브러리다.
★ dendrogram은 계층적 클러스터링에서 사용되는 시각화방법이다.
데이터를 유사도에 따라 그룹화하는 방법.
각 데이터 포인트를 독립적인 클러스터로 시작하여, 가장 가까운 클러스터끼리 차례대로 합치면서, 최종적으로 하나의 클러스터가 될 때까지 진행된다.
import missingno as mogn
mogn.dendrogram(train_df)
7. rename , str, lower()
컬럼 이름을 바꾼다.
★ str 문자열 메소드 쓰기 위함
★ lower() 소문자로
★ upper() 대문자로
train_df.rename(columns={'PassengerId':'Passenger_id','SibSp':'Sib_Sp'},inplace=True)
test_df.rename(columns={'PassengerId':'Passenger_id','SibSp':'Sib_Sp'},inplace=True)
train_df.columns=train_df.columns.str.lower()
test_df.columns=test_df.columns.str.lower()
8. re
정규표현식 regular expression을 지원하기 위해 제공되는 표준 라이브러리이다.
특정 패턴을 검색, 대체, 분리하는 복잡한 문자열 처리를 쉽게 할 수 있다.
< 주요 함수 >
★ match() 문자열의 시작부터 패턴이 일치하는지 확인
findall() 패턴과 일치하는 모든 부분을 리스트로 반환
sub() 패턴과 일치하는 모든 부분을 주어진 문자열로 대체
★ search() 문자열 전체에서 패턴과 일치하는 부분 검색
compile() 정규 표현식 패턴을 컴파일하여 객체 생성
dataset['deck'] = dataset['cabin'].map(lambda x: re.compile("([a-zA-Z]+)").search(x).group())
re.compile("([a-zA-Z]+)") : 알파벳에 해당하는 문자열 패턴을 컴파일한다.
.search(x).group() x문자열에서 검색을 수행하고, 일치하는 부분의 문자열을 반환한다.
9. 결측값 처리 전후 비교
< 그래프 >
df_con=train_df.copy()
#전: 오렌지색 / 후: 파랑색
df_con.age.plot.kde(color='orange',label='age')
df_con.age.fillna(value=df_con.age.median()).plot.kde(color='blue',label='age_fillna')
< 표준편차 >
round(df_con.age.std(),2),round((df_con.age.fillna(value=df_con.age.median())).std(),2)
10. StadardScaler
데이터 표준화하는 데 사용하는 함수.
★ feature의 평균을 0, 분산을 1로 조정하여 데이터의 스케일을 표준화한다.
# 숫자형 dtype 컬럼만 뽑기
num_name=list(train_df.select_dtypes('number').drop(['passenger_id','survived'],axis=1).columns)
# 숫자형 dtype의 df 뽑기
number_df=train_df.select_dtypes('number').drop(['passenger_id','survived'],axis=1)
# 스케일러 선택하기
scaler=StandardScaler()
https://olivia-blackcherry.tistory.com/532
11. fit_transform
데이터전처리과정에서 fit과 transform 동시에 수행.
★ fit : 데이터 변환을 위한 기준 정보(평균, 표준편차 등)들을 계산
★ transform : 기준 정보를 사용하여 데이터를 변환한다.
---> 데이터변환을 위한 기준을 설정하고, 그 기준에 따라 데이터를 변환.
+ 데이터의 특성별로 값의 범위가 다를 때, 이를 일정한 범위로 조정하는 과정에서 사용된다.
from sklearn.preprocessing import StandardScaler
def scaler_data(df,scaler,columns):
"""
function to scaler the data
"""
df_scaler=df.copy()
if columns:
df_scaler[columns]=scaler.fit_transform(df_scaler[columns])
else:
columns=[col for col in df_scaler]
df_scaler[columns]=scaler.fit_transform(df_scaler[columns])
return df_scaler,scaler
df_scaled,scaler=scaler_data(number_df,scaler=scaler,columns=num_name)
df_scaled.head()
12. KNNImputer (K-nearest Neighbors)
최근접 이웃 알고리즘이다. 주어진 데이터셋에서 누락된 값이 있는 샘플의 가장 가까운 k개의 이웃을 찾아, 그 이웃들의 평균값으로 누락값을 대체한다.
from sklearn.impute import KNNImputer,SimpleImputer
knn_imputer=SklearnTransformerWrapper(transformer=KNNImputer(n_neighbors=3,weights='distance'),variables=num_name)
df_imputed = knn_imputer.fit_transform(df_scaled)
SklearnTransformerWrapper와 KNNImputer을 활용해 누락값을 채워보자.
★ n_neighbors 이웃수
★ weights : 이웃의 거리에 따라 가중치를 다르게 적용
★ distance : 가까운 이웃일수록 더 큰 가중치
★ transformer : 선택한 feature에 대해 skcitlearn변환기를 적용하는 wrapper.
★ variable : 파라미터를 통한 변환을 적용할 변수를 지정.
< 시각화 >
# 기본 age 그래프(오렌지)
df_con.age.plot.kde(color='orange',label='age')
# scaler된 age 그래프(파랑)
df_imputed.age.plot.kde(color='blue',label='age_knn')
# age에 null각ㅄ을 0을 바꾼상황에서
df_con.age.fillna(value=df_con.age.median()).plot.kde(color='green',label='age_fillna')
plt.legend()
plt.show()
print(round(df_con.age.std(),2),round(df_imputed.age.std(),2))
13. IterativeImputer
누락된 값을 예측하기 위해 각 특성을 다른 특성의 함수로 모델링하는 전략.
라운드 로빈 방식으로 진행되며, extraTreeRegressor을 예측 모델로 사용했다.
train_data 변환
miss_forest=IterativeImputer(estimator=ExtraTreesRegressor(),
initial_strategy='median',max_iter=200)
tree_imputed=miss_forest.fit_transform(number_df)
tree_imputed_df=pd.DataFrame(data=tree_imputed,columns=miss_forest.get_feature_names_out())
test_data 변환
test_imputed=miss_forest.transform(test_df[num_name])
test_imputed_df=pd.DataFrame(data=test_imputed,columns=miss_forest.get_feature_names_out())
<시각화>
tree_imputed_df.age.plot.kde(color='red',label='age_tree')
print(round(df_con.age.std(),2),round(df_imputed.age.std(),2),round(tree_imputed_df.age.std(),2))
<변환된 값으로 다시 바꾸기>
train_df['age']=tree_imputed_df['age']
test_df['age']=test_imputed_df['age']
test_df['fare']=test_imputed_df['fare']
#fill the missing value with the mode value
train_df['embarked'].fillna(value='S' ,inplace=True)
14. OnehotEncoder 원핫인코딩
필요없는 열은 삭제한다.
for df in data:
df.drop(['name','ticket','passenger_id'],axis=1,inplace=True)
원핫인코딩 함수를 만든다.
from sklearn.preprocessing import OneHotEncoder,LabelEncoder
from sklearn.preprocessing import StandardScaler
def ohe_encoder(data):
df=data.copy()
ohe_cols=[col for col in df if df[col].dtype in ['object','category']]
ohe=OneHotEncoder(drop='first',sparse_output=False)
ohe_encoder=ohe.fit_transform(df[ohe_cols])
df_ohe_encoded=pd.DataFrame(ohe_encoder,columns=ohe.get_feature_names_out())
df_encoded=pd.concat([df_ohe_encoded,df],axis=1)
df_encoded.drop(ohe_cols,axis=1,inplace=True)
return df_encoded
OneHotEncoder(drop='first', sparse_output=False)
★ drop='first'
각 특성에서 첫 번째 범주를 삭제한다.
dummy variable trap을 피하고, multicollinearity 다중공선성 문제를 줄이는 데 도움이 됨
★ sparse_output=False
밀집된 출력을 생성하도록 한다.
df_encoded=ohe_encoder(train_df)
df_encoded.head()
https://olivia-blackcherry.tistory.com/575
15. normalize
★ standardscaler를 이용하여 정규화 시켜준다.
평균0, 표준편차1의 분포로!
def normalize_data(data):
df=data.copy()
scaler=StandardScaler()
for col in df:
if col != 'survived':
df[col]=scaler.fit_transform(df[[col]])
return df
scaled_df=normalize_data(df_encoded)