FUNDAMENTAL | 10. NumPy, Pandas

yeonk·2021년 9월 25일
0

aiffel-ai-bootcamp

목록 보기
23/38
post-thumbnail

20210924



1. 탐색적 데이터 분석(Exploratory Data Analysis, EDA)


데이터 분석과 더 좋은 머신러닝 모델을 만들기 위해 필수적인 과정

  • 데이터를 다루는 작업을 할 때는 어떤 데이터든 처음에 이렇게 간략하게라도 꼭 데이터셋을 이해하고 시작하는 것이 중요하다.
  • 원본 데이터를 메모리 상에 따로 두는 습관
    • 데이터를 다루면서 데이터셋에 다양한 작업을 할 것이기 때문에 원본 데이터는 훼손하지 않고 보존하면 좋다.






  • numpy, pandas: 1차원 또는 2차원 형식의 표 데이터를 다루기에 최적화된 라이브러리

  • seaborn, matplotlib
    • 데이터를 그래프 등으로 시각화
    • seabornmatplotlib의 상위 버전(seaborn은 보다 고급화된 그래프)






2. 데이터 확인


데이터를 불러온 후에는 데이터셋에 대한 이해를 하는 것이 좋다.



isnull(): 빈 데이터(결측치)를 확인
isna(): 데이터가 비어있는 NaN 값의 개수를 확인하고 싶을 때 사용

subplot: 두 개의 그래프를 한 번에 그리기
countplot: 데이터의 개수를 표시하는 플롯. 결측값은 자동으로 제외

pd.concat: 행들을 합쳐서 볼 수 있다.

# 빈 데이터 확인하기
pokemon.isnull().sum()


# 집합 만들기 (set), 개수 확인하기
len(set(pokemon["Name"]))


# NaN 값 개수 확인
pokemon["Type 2"].isna().sum()


# subplot, countplot 활용
plt.figure(figsize=(10, 7))  # 화면 해상도에 따라 그래프 크기를 조정해 주세요.

plt.subplot(211)
sns.countplot(data=ordinary, x="Type 1", order=types).set_xlabel('')
plt.title("[Ordinary Pokemons]")

plt.subplot(212)
sns.countplot(data=legendary, x="Type 1", order=types).set_xlabel('')
plt.title("[Legendary Pokemons]")

plt.show()


# 피벗 테이블 활용
# sort_value: 높은 것 부터 낮은 순으로 정렬 

# Type1별로 Legendary 의 비율을 보여주는 피벗 테이블
pd.pivot_table(pokemon, index="Type 1", values="Legendary").sort_values(by=["Legendary"], ascending=False)






3. 전처리


  • 데이터를 모델에 입력할 수 있는 형태로 변환하는 것이 매우 중요

  • 머신러닝을 수행할 모델은 문자열 데이터를 처리할 수 없기 때문에 이를 적절한 숫자 데이터 또는 True, False를 나타내는 부울(bool) 데이터 등으로 전처리하는 과정이 필요






isalpha(): 어떤 문자열이 알파벳으로만 이루어져 있는지를 확인하고 싶을 때 사용 (띄어쓰기도 False 처리 되니 주의)

replace(): 문자열을 원하는 다른 문자열로 바꾸고 싶을 때

# isalpha 사용하기
pokemon["name_isalpha"] = pokemon["Name_nospace"].apply(lambda i: i.isalpha())

# replace 사용하기
pokemon = pokemon.replace(to_replace="Nidoran♀", value="Nidoran X")






토큰화(tokenizing) 하기

  • 토큰을 추출하기 위해 토큰화 (모든 토큰으로 분리) 할 수 있는 함수를 생성

  • 문자열을 처리할 때는 주로 정규표현식(RegEx: Regular Expression) 이라는 기법이 사용

정규표현식: 문자열을 처리하는 방법.
특정한 조건을 만족하는 문자를 검색 or 치환하는 등의 작업을 하고 싶을 때 사용하는 도구

findall: re패키지의 함수로 패턴을 찾는다.



# split으로 이름 분리
name = "CharizardMega Charizard X"
name_split = name.split(" ")

# 첫번째 요소 분리하기
temp = name_split[0]

# 대문자로 시작해서 소문자로 끝나는 패턴 찾기
tokens = re.findall('[A-Z][a-z]*', temp)

# 위 내용을 합쳐 토큰화 함수 만들기
def tokenize(name):
    name_split = name.split(" ")
    
    tokens = []
    for part_name in name_split:
        a = re.findall('[A-Z][a-z]*', part_name)
        tokens.extend(a)
        
    return np.array(tokens)

[A-Z]: A 부터 Z까지의 대문자 중 한가지로 시작,

[a-z]: 그 뒤에 a부터 z까지의 소문자 중 한 가지가 붙는데,

*: 그 소문자의 개수는 하나 이상인 패턴 (*는 정규표현식 중에서 "반복"을 나타내는 기호)






collection: list 또는 set의 자료형에서 각 요소의 개수를 다루고 싶을 때 사용하면 좋은 파이썬 패키지.
순서가 있는 딕셔너리인 OrderedDict, 요소의 개수를 카운트하는 Counter 등 여러 다양한 모듈을 제공

most_common: 가장 많은 요소와 등장 횟수가 무엇인지를 정렬

str.contains: Pandas에서 문자열 데이터셋에 특정 구문이 포함되어 있는지 여부 확인


from collections import Counter
a = [1, 1, 0, 0, 0, 1, 1, 2, 3]
Counter(a)

Counter(a).most_common()

# str.contains 사용
for token, _ in most_common:
    pokemon[token] = pokemon["Name"].str.contains(token)

pokemon.head(10)






원-핫 인코딩(One-Hot Encoding): 주어진 카테고리 중 단 하나만 1(True), 나머지는 모두 0(False)로 나타나도록 인코딩하는 방식

Integer Encoding: 각 카테고리를 숫자로 변환하는 방식

# 원 핫 인코딩
for t in types:
    pokemon[t] = (pokemon["Type 1"] == t) | (pokemon["Type 2"] == t)
    
pokemon[[["Type 1", "Type 2"] + types][0]].head()






4. 베이스라인(Baseline)


베이스라인 모델: 가장 기초적인 방법으로 만든 모델.

베이스 라인은 성능은 안 좋을지 모르지만, 성능 하한선을 제공함 → 새롭게 만들 모델이 맞는 방향으로 가고 있는지 확인






5. 의사 결정 트리


의사 결정 트리(decision tree)은 sklearn 패키지의 DecisionTreeClassifier 모듈로 불러올 수 있습니다.

random_state: 모델의 랜덤성을 제어.
실험 단계에서는 랜덤성에 의해 학습 결과가 차이나는 것을 방지하기 위해 하나의 값으로 고정해서 실험하는 것이 좋다.



from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier(random_state=25)
model


# 모델 학습 시키기
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

# 결과 확인하기
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred)



  • 수치 해석하기
    • TN (True Negative) : 옳게 판단한 Negative
    • FP (False Positive) : 틀리게 판단한 Positive
    • FN (False Negative) : 틀리게 판단한 Negative
    • TP (True Positive) : 옳게 판단한 Positive






Recall

Recall=TPFN+TPRecall = \cfrac{TP}{FN + TP}






추가 학습 링크

파이썬 차집합 함수(set difference)

판다스 isna() 함수

pandas의 sum() 함수

파이썬 람다 문법

pandas의 isalpha() 함수

위키독스-정규표현식 시작하기

Counter

Why One-Hot Encode Data in Machine Learning?

pandas의 == 문법

Confusion Matrix

0개의 댓글