본문 바로가기

IT 로그

21.11.10 AI 공부 로그

728x90
반응형

* colab 데이터 불러오기

colab 왼쪽 아이콘 중 폴더 모양 클릭 후

colab에 불러오려는 파일들을 drag & drop 해준다 

# 데이터 불러오기 
df_train = pd.read_csv ('/content/train.csv') 
df_test =  pd.read_csv ('/content/test.csv')

pandas에 read_csv 함수를 이용해서 불러온다 

경로는 /content/ 를 앞에 붙여주면 되더라 

 

* 왜도  & 첨도 

 

왜도 : 분포의 비대칭성을 의미

정규분포에 대해서 얼마나 비대칭인지

 

첨도 : 분포가 얼마나 뾰족한지

낮아야 정규분포와 가깝다 

 

* 상관관계 그래프 

 

- 수치형 (산점도)

 

- 범주형 (box plot)

* missing value check

결측치 체크를 해보자 

#total = df_train.isna()

total = df_train.isnull().sum().sort_values(ascending = False) #내림차순 
percent = (df_train.isnull().sum() / df_train.isnull().count()).sort_values(ascending = False)

퍼센트로 나오는데 PoolQC 필드는 99 프로가 결측치다.. 데이터가 거의 없다 

missing = df_train.isnull().sum() 
missing = missing[missing > 0 ]  # 실제 missing 인 건들 
missing.sort_values (inplace = True) #
missing.plot.bar(figsize = (12,6))

 --  > inplace = True를 사용하면 한번에 기존 변수에 덮어쓸 수 있다?! 

 

#결측치 대체 하는 코드 
modify_data.loc[modify_data['GarageYrBlt'].isnull(), 'GarageYrBlt'] = 0

 

*결측치 처리 전략

결측치는 무조건 채워줘야 한다. 그래야 모델이 돌아간다

특히 시계열 모형은 무조건 채워주는게 중요함 

 - 제거 (Deletion)

 - 대치 (Imputation) 

 - 예측 모델 (Prediction Model) 

 

 1. 제거 : 결측치의 특성이 '무작위로 손실' 되지 않았다면, 대부분의 경우 가장 좋은 방법은 제거하는 것

   : 제거 방식은 목록 삭제(Listwist) 단일값 삭제(Pairwise) 방식으로 다시 구분된다.

    > 사용함수 : dropna() 

         pandas에서 제공하는 Na/ NaN 과 같은 누락 데이터 제거 함수 

         axis : 파라미터 값으로 0을 주면 제거 1을 주면 열 제거, default 값은 0

         subset : array, 특정 Feature를 지정하여 해당 Feature의 누락 데이터 제거가 가능 

 

    > 목록 삭제 (ListWise) 

        - 행 전체가 결측치인 행만 삭제

              

        - 행 전체가 결측치인 행만 삭제 

    데이터는 무조건 copy 뜨고 시작하는게 좋다 (✨습관 들이기 ✨)

 2. 대치 : 결측치를 특정 값으로 대치 

      1. 최빈값 (mode) : 범주형에서 결측값이 발생시, 범주별 빈도가 가장 높은 값으로 대치한다.

      2. 중앙값 (mdeian) : 숫자형(연속형) 에서 결측값을 제외한 중앙값으로 대치방법

  * fiillna() :  전체 결측치를 특정 단일값으로 채우는 함수 

결측치를 정의하는 것도 필드마다 다르다 .. 어디서는 0이아닌 999를 결측치로 해놓은 곳도 있다 

3. 예측 모델 (Prediction Model) 

예측 기법을 사용한 결측치 추정은 결측치들의 특성이 패턴을 가진다고 가정하고 진행된다. 

결측값이 없는 컬럼들로 구성된 dataset으로 결측값이 없는 컬럼을 예측한다. 

회귀 분석 기술을 활용하거나 SVM 과 같은 기계 학습 방법 또는 이러한 결측치를 채우는 데이터 마이닝 방법과 같은 다양한 통계 방법이 있다. 

  * 결측치 처리 가이드 라인 

      - 10% 미만 

      - 50% 미만 .. 

 

4. KNN Imputer 사용

지도학습 비지도 학습 혼합해서 하이브리드 형태로 쓰는 경우가 있다. 

https://wooono.tistory.com/103

 

#결측치를 대체해주는 함수 만들기
#함수 > class 
#class 속성 ! -> class(부모) -> def(자식) : 전역변수 
#def -> class x 지역변수 / 전역변수 -> 지역변수 영향 0 반대는 안된다 

def imputer_lotfrontage(raw_data):
  print('Number of null values of LotFrontage *Before Modify*:', raw_data['LotFrontage'].isnull().sum())
  # KNN Imputer  불러오기 
  from sklearn.impute import KNNImpuer
  
  
#LotFrontage 변수에 결측치를 가지는 'id' 추출후 저장
miss_id = raw_data[raw_data['LotFrontage'].isnull()]['Id'].unique() # unique : pandas Series 에서 중복제거
#DataFrame 중복제거 -> drop_duplicate 사용 

#LotFronage 변수 값이 300 넘는 관측치를 삭제하기로 했으므로 삭제 
outlier_id = data[data['LotFrontage'] > 300]['Id']

data = data [~data['id'].isna(outlier_id)] # 300 이 넘는 것중에 결측치가 아닌 건들을 저장

unique 함수는 pandas series에서 중복제거 할 때 사용

drop_duplicate는 data frame에서 중복제거 할 때 사용 

 

#'id' 변수를 인덱스로 지정
# re index 작업  
data = data.set_index('id')

re indexing 작업 

위에서 삭제하면서 index 가 다 달라짐 

# 'LotArea' 변수를 로그화 수행 후 , 변수 삭제 
# 적용했으니까 변수를 삭제해야지 feature 값 그대로 
# 안그러면 결과가 엇갈리게 됨 
# 지수로 다시 풀어줘야 함 .. 
data['LotLotArea']  = data['LogArea'].apply(lambda x  : np.log(x))
data = data.drop('LotArea' , axis = 1 )

** one-Hot Encoding 

자연어 처리에는 문자를 숫자로 바꾸는 여러가지 기법이 있는데 그 중 단어를 표현하는 가장 기본적인 표현 방법 

단어 집합을 만드는 일부터 시작 

단어의 집합에 고유한 숫자를 부여하는 정수 인코딩 진행 

원핫인코딩이란 ? : 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고 다른 인덱스에 0을 부여하는 단어의 표현 방식이다. 이렇게 표현된 벡터는 원-핫 벡터 라고 한다. 

https://wikidocs.net/22647

 

08) 원-핫 인코딩(One-Hot Encoding)

컴퓨터 또는 기계는 문자보다는 숫자를 더 잘 처리 할 수 있습니다. 이를 위해 자연어 처리에서는 문자를 숫자로 바꾸는 여러가지 기법들이 있습니다. 원-핫 인코딩(One-Ho ...

wikidocs.net

 

반응형