데이터 분석과 더 좋은 머신러닝 모델을 만들기 위해 필수적인 과정
numpy
, pandas
: 1차원 또는 2차원 형식의 표 데이터를 다루기에 최적화된 라이브러리seaborn
, matplotlib
seaborn
은 matplotlib
의 상위 버전(seaborn
은 보다 고급화된 그래프)
데이터를 불러온 후에는 데이터셋에 대한 이해를 하는 것이 좋다.
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)
데이터를 모델에 입력할 수 있는 형태로 변환하는 것이 매우 중요
머신러닝을 수행할 모델은 문자열 데이터를 처리할 수 없기 때문에 이를 적절한 숫자 데이터
또는 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")
토큰을 추출하기 위해 토큰화 (모든 토큰으로 분리) 할 수 있는 함수를 생성
문자열을 처리할 때는 주로 정규표현식(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()
베이스라인 모델: 가장 기초적인 방법으로 만든 모델.
베이스 라인은 성능은 안 좋을지 모르지만, 성능 하한선을 제공함 → 새롭게 만들 모델이 맞는 방향으로 가고 있는지 확인
의사 결정 트리(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)