머신러닝/캐글

[필사] Porto Seguro Exploratory Analysis and Prediction - 아직 완성 못함

have a good time 2021. 10. 31. 15:33

 

 

Analysis packages

# 코드 1

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.utils import shuffle
from sklearn.preprocessing import Imputer
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import VarianceThreshold
from sklearn.feature_selection import SelectFromModel

from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import cross_val_score

from lightgbm import LGBMClassifier
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression

pd.set_option('display.max_columns', 100)

 

에러 : cannot import name 'Imputer' from 'sklearn.preprocessing'

해결법 :

from sklearn.preprocessing import Imputer 대신

from sklearn.impute import SimpleImputer  사용

참고 자료 : 

https://log-laboratory.tistory.com/328

 

[tensorflow] cannot import name 'Imputer' from 'sklearn.preprocessing'

현상 sklearn.preprocessing에서 Imputer 를 불러올때, 아래와 같은 오류가 발생했다. 에러 화면 해결 방법 Imputer 3 버전 전에 사용되지 않으며 0.22에서 제거되었다. Imputer 모듈을 불러오기 위해선 sklearn..

log-laboratory.tistory.com

 

 

 

# 코드 2

trainset = pd.read_csv('Kaggle/train.csv')
testset = pd.read_csv('Kaggle/test.csv')

csv 형식의 데이터 읽어오기 

 

# 코드 3

trainset.head()

trainset 자료에서 일부분 출력해보기

 

  id target ps_ind_01 ps_ind_02_cat ps_ind_03 ps_ind_04_cat ps_ind_05_cat ps_ind_06_bin ps_ind_07_bin ps_ind_08_bin ps_ind_09_bin ps_ind_10_bin ps_ind_11_bin ps_ind_12_bin ps_ind_13_bin ps_ind_14 ps_ind_15 ps_ind_16_bin ps_ind_17_bin ps_ind_18_bin ps_reg_01 ps_reg_02 ps_reg_03 ps_car_01_cat ps_car_02_cat ps_car_03_cat ps_car_04_cat ps_car_05_cat ps_car_06_cat ps_car_07_cat ps_car_08_cat ps_car_09_cat ps_car_10_cat ps_car_11_cat ps_car_11 ps_car_12 ps_car_13 ps_car_14 ps_car_15 ps_calc_01 ps_calc_02 ps_calc_03 ps_calc_04 ps_calc_05 ps_calc_06 ps_calc_07 ps_calc_08 ps_calc_09 ps_calc_10 ps_calc_11 ps_calc_12 ps_calc_13 ps_calc_14 ps_calc_15_bin ps_calc_16_bin ps_calc_17_bin ps_calc_18_bin ps_calc_19_bin ps_calc_20_bin
0 7 0 2 2 5 1 0 0 1 0 0 0 0 0 0 0 11 0 1 0 0.7 0.2 0.718070 10 1 -1 0 1 4 1 0 0 1 12 2 0.400000 0.883679 0.370810 3.605551 0.6 0.5 0.2 3 1 10 1 10 1 5 9 1 5 8 0 1 1 0 0 1
1 9 0 1 1 7 0 0 0 0 1 0 0 0 0 0 0 3 0 0 1 0.8 0.4 0.766078 11 1 -1 0 -1 11 1 1 2 1 19 3 0.316228 0.618817 0.388716 2.449490 0.3 0.1 0.3 2 1 9 5 8 1 7 3 1 1 9 0 1 1 0 1 0
2 13 0 5 4 9 1 0 0 0 1 0 0 0 0 0 0 12 1 0 0 0.0 0.0 -1.000000 7 1 -1 0 -1 14 1 1 2 1 60 1 0.316228 0.641586 0.347275 3.316625 0.5 0.7 0.1 2 2 9 1 8 2 7 4 2 7 7 0 1 1 0 1 0
3 16 0 0 1 2 0 0 1 0 0 0 0 0 0 0 0 8 1 0 0 0.9 0.2 0.580948 7 1 0 0 1 11 1 1 3 1 104 1 0.374166 0.542949 0.294958 2.000000 0.6 0.9 0.1 2 4 7 1 8 4 2 2 2 4 9 0 0 0 0 0 0
4 17 0 0 2 0 1 0 1 0 0 0 0 0 0 0 0 9 1 0 0 0.7 0.6 0.840759 11 1 -1 0 -1 14 1 1 2 1 82 3 0.316070 0.565832 0.365103 2.000000 0.4 0.6 0.0 2 2 6 3 10 2 12 3 1 1 3 0 0 0 1 1 0

 

 

자료에서 보면 

ps_car_08_cat 과 같이 cat values가 있다.

이는 categorical이며, 0~n의 범위를 같는 Integer 형 변수이다.

 

판다스에서 category 형 타입이란, 예를 들어 성별(남, 여), 나이(10대 20대..) 같이 특정 구간의 데이터가 반복되는 경우를 의미한다.

참고자료 : https://computer-science-student.tistory.com/302 

 

 

 

또 

ps_calc_19_bin와 같이 bin values가 있다.

이는 0또는 1을 나타내는 binary 변수이다. 

 

# 코드 3

print("Train dataset (rows, cols):",trainset.shape, "\nTest dataset (rows, cols):",testset.shape)

Train dataset (rows, cols): (595212, 59)

Test dataset (rows, cols): (892816, 58)

 

trainset, testset 의 행,렬의 개수를 확인해본다.

testset의 column 수가 1개 작은 58개로 나오는데, 이는 target column이 없어서 그런다.

 

이를 확인해 보겠다.

 

# 코드 4

print("Columns in train and not in test dataset:",set(trainset.columns)-set(testset.columns))

Columns in train and not in test dataset: {'target'}

 

 

Introduction of metadata

 

사용될 metadata

 

  • use: input, ID, target
  • type: nominal, interval, ordinal, binary
  • preserve: True or False
  • dataType: int, float, char
  • category: ind, reg, car, calc

# 코드 5

# uses code from https://www.kaggle.com/bertcarremans/data-preparation-exploration (see references)
data = []
for feature in trainset.columns:
    # Defining the role
    if feature == 'target':
        use = 'target'
    elif feature == 'id':
        use = 'id'
    else:
        use = 'input'
         
    # Defining the type
    if 'bin' in feature or feature == 'target':
        type = 'binary'
    elif 'cat' in feature or feature == 'id':
        type = 'categorical'
    elif trainset[feature].dtype == float or isinstance(trainset[feature].dtype, float):
        type = 'real'
    elif trainset[feature].dtype == int:
        type = 'integer'
        
    # Initialize preserve to True for all variables except for id
    preserve = True
    if feature == 'id':
        preserve = False
    
    # Defining the data type 
    dtype = trainset[feature].dtype
    
    category = 'none'
    # Defining the category
    if 'ind' in feature:
        category = 'individual'
    elif 'reg' in feature:
        category = 'registration'
    elif 'car' in feature:
        category = 'car'
    elif 'calc' in feature:
        category = 'calculated'
    
    
    # Creating a Dict that contains all the metadata for the variable
    feature_dictionary = {
        'varname': feature,
        'use': use,
        'type': type,
        'preserve': preserve,
        'dtype': dtype,
        'category' : category
    }
    data.append(feature_dictionary)
    
metadata = pd.DataFrame(data, columns=['varname', 'use', 'type', 'preserve', 'dtype', 'category'])
metadata.set_index('varname', inplace=True)
metadata

 

코드 설명

 

1)

for feature in trainset.columns:

 

-> trainset의 columns 를 feature 라고 하여,

columns 에는 

id

target

ps_ind_01

ps_ind_02_cat

ps_ind_03

ps_ind_04_cat

ps_ind_05_cat

ps_ind_06_bin

ps_ind_07_bin

ps_ind_08_bin

ps_ind_09_bin

 

등이 있다.

 

2) 

if feature == 'target': use = 'target'

-> 만약 feature == target 이면, use라는 칼럼을 만들고 그 값은 target이라고 입력한다.

 

3)

if 'bin' in feature or feature == 'target': type = 'binary'

->만약 feature 에 bin이라는 글자가 포함되어 있거나(ex: ps_ind_06_bin),

 feature 값이 target이라면,

type 이라는 칼럼을 만들 때 그 값은 binary 로 입력한다.

 

4)

elif trainset[feature].dtype == float or

-> trainset의 feature 들 중에 type 이 float 이거나 

 

5)

 isinstance(trainset[feature].dtype, float): 

 

-> trainset의 feature 의 인스턴스 타입이 float 이면

(isinstance(인스턴스, 클래스/데이터타입) : 인스턴스가 특정 클래스/데이터 타입과 일치하면 True, 아니면 false 출력

 

참고 자료 : 

https://devpouch.tistory.com/87

 

 

type = 'real'

 

-> type 칼럼에다가 그 값을 real 이라고 입력해라

 

print(trainset.info()) 이렇게 코드 입력시,

trainset 의 정보를 확인할 수 있는데

 

 #   Column          Non-Null Count   Dtype  
---  ------          --------------   -----  
 0   id              595212 non-null  int64  
 1   target          595212 non-null  int64  
 2   ps_ind_01       595212 non-null  int64  
 3   ps_ind_02_cat   595212 non-null  int64  
 4   ps_ind_03       595212 non-null  int64  
 5   ps_ind_04_cat   595212 non-null  int64  
 6   ps_ind_05_cat   595212 non-null  int64  
 7   ps_ind_06_bin   595212 non-null  int64  
 8   ps_ind_07_bin   595212 non-null  int64  
 9   ps_ind_08_bin   595212 non-null  int64  
 10  ps_ind_09_bin   595212 non-null  int64  
 11  ps_ind_10_bin   595212 non-null  int64  
 12  ps_ind_11_bin   595212 non-null  int64  
 13  ps_ind_12_bin   595212 non-null  int64  
 14  ps_ind_13_bin   595212 non-null  int64  
 15  ps_ind_14       595212 non-null  int64  
 16  ps_ind_15       595212 non-null  int64  
 17  ps_ind_16_bin   595212 non-null  int64  
 18  ps_ind_17_bin   595212 non-null  int64  
 19  ps_ind_18_bin   595212 non-null  int64  
 20  ps_reg_01       595212 non-null  float64
 21  ps_reg_02       595212 non-null  float64
 22  ps_reg_03       595212 non-null  float64
 23  ps_car_01_cat   595212 non-null  int64  
 24  ps_car_02_cat   595212 non-null  int64  
 25  ps_car_03_cat   595212 non-null  int64  
 26  ps_car_04_cat   595212 non-null  int64  
 27  ps_car_05_cat   595212 non-null  int64  
 28  ps_car_06_cat   595212 non-null  int64  
 29  ps_car_07_cat   595212 non-null  int64  
 30  ps_car_08_cat   595212 non-null  int64  
 31  ps_car_09_cat   595212 non-null  int64  
 32  ps_car_10_cat   595212 non-null  int64  
 33  ps_car_11_cat   595212 non-null  int64  
 34  ps_car_11       595212 non-null  int64  

 

이렇게 데이터 타입을 확인할 수 있다.

따라서 float 타입이면 type이라는 칼럼에 real이 입력된다.

 

 

6) 

dtype = trainset[feature].dtype

 

-> 코드 아래부분에서 metadata라는 DataFrame을 만드는데,

여기다가 각 feature 들의 타입을 dtype라는 칼럼을 이용해서 나타냄

 

7)

category = 'none'

# Defining the category

if 'ind' in feature:

   category = 'individual'

 

 

-> 일단 category 칼럼은 모두 none으로 초기화 시켜놓고

만약 feature 이 ind 라는 문자열을 포함하고 있으면( 예를 들어 ps_ind_05_cat)

category = individual

 

8)

 

feature_dictionary = {

   'varname': feature,

   'use': use,

   'type': type,

   'preserve': preserve,

   'dtype': dtype,

   'category' : category

  }

  data.append(feature_dictionary)

 

 

-> 각 feature(id, target, ps_ind_01, ps_ind_02_cat, ps_ind_03 등) 들이

varname 이라는 항목으로 들어감

 

 

 

9)

metadata = pd.DataFrame(data, columns=['varname', 'use', 'type', 'preserve', 'dtype', 'category']) metadata.set_index('varname', inplace=True)

 

data를 이용해서 metadata라는 DataFrame을 만드는데,

metadata.set_index('varname', inplace=True) 이 코드를 이용해서,

varname이라는 항목을 기준으로 표가 만들어짐

(varname을 인덱스로 하여 표가 만들어짐)

 

표 왼쪽에 보면 varname 이라고 해서 

아래쪽으로 id, target, ps_ind_01 값들을 기준으로 그 옆에 use, type, preserv, dtype, category 값들이 나오고 있음

 

 

 

참고 자료 : https://www.kaggle.com/gpreda/porto-seguro-exploratory-analysis-and-prediction/notebook

 

Porto Seguro Exploratory Analysis and Prediction

Explore and run machine learning code with Kaggle Notebooks | Using data from Porto Seguro’s Safe Driver Prediction

www.kaggle.com