221007 Day30

유예지·2022년 10월 7일

1006 복습

1

>>> import pydataset
>>> import pandas as pd

#pydataset에 있는 tips를 이용하여 요일별로 흡연자/비흡연자가 몇명씩 방문하였는지 출력
>>> tips = pydataset.data("tips")
	tips[:5]
    
>>> tips.groupby(['day', 'smoker'])[['smoker']].count()
>>> tips.groupby('day')['smoker'].value_counts()

2

>>> import numpy as np
>>> df = pd.DataFrame({'key1': ['a', 'a', 'b',' b', 'a'],
                      'key2': ['one', 'two', 'one', 'two', 'one'],
                      'data1': np.random.randn(5),
                      'data2': np.random.randn(5)})
    df
    
#key1으로 묶고 각 그룹에서 data1의 평균
>>> df.groupby('key1')[['data1']].mean()    

3

>>> mpg = pydataset.data("mpg")
	mpg.head()
    
#class별 manufacturer의 빈도수를 구하는 표
>>> pd.crosstab(index = mpg['class'], columns = mpg['manufacturer'])

#위의 df 에서 manufacturer 를 melt 시켜라
>>> df = pd.crosstab(index = mpg['class'], columns = mpg['manufacturer'])
	df.reset_index()
    
>>> df.reset_index().melt(id_vars = 'class')
>>> df.reset_index().melt
>>> df.reset_index().melt(id_vars = 'class', value_name = 'count')

>>> df.reset_index().columns
>>> df.reset_index().columns[1:]

#manufacturer 종류가 많아 다 쓸 수 없으므로 -> 'df.reset_index().columns[1:]'
>>> df.reset_index().melt(id_vars = 'class', value_vars = df.reset_index().columns[1:])

#value가 0~9는 few, 10~19는 many 라는 새로운 열 frequency 추가
>>> df1 = df.reset_index().melt(id_vars = 'class', value_vars = df.reset_index().columns[1:])

    bins = [0,10,20]
    labels = ['few', 'many']
    df1['frequency'] = pd.cut(df1['value'], bins = bins, labels = labels, right = False)
    df1

4

>>> mpg[:5]

#'manufacturer'과 'year'별로 다른 모든 칼럼의 평균과 최대값
>>> mpg.groupby(['manufacturer', 'year']).agg(['mean', 'max'])

#displ은 최대값, cyl은 합
>>> mpg.groupby(['manufacturer', 'year']).agg({'displ' : np.max, 'cyl' : sum})

머신 러닝

일반적으로 지도학습, 비지도학습, 강화학습 으로 나뉜다

회귀 : 숫자를 예측, 출력값에 '연속성' 이 있다 (ex. 몸무게를 이용해 키를 예측)
분류 : O, X 를 판단, 중간은 없다 (ex. 남자인가? -> 예/아니오)
군집 : 맞다 틀리다의 답이 정해져 있지 않음, 유사한 속성을 갖는 데이터를 그루핑

1. 파이썬 기반의 머신러닝

* DataFrame을 ndarray, list, dict 로 변환하기

>>> import pandas as pd
	import pydataset

>>> mpg = pydataset.data("mpg")
	mpg[:5]
    
>>> df = mpg.iloc[:5, 2:5]
	df
#1. df를 ndarray 로 변환
>>> df.values

#2. df를 dict 로 변환
>>> df.to_dict()

#3. df를 list 로 변환
>>> df['displ'].tolist()
#DataFrame 상태에서 바로 변환은 어렵다 -> Series 형태로 변환 후

>>> df.values.tolist()   #중첩 리스트로 출력된다
  • 한 개의 리스트로 변환하려면
#내가 생각한 방법
>>> li = df.values.tolist()

    lst = []
    for i in range(len(li)):
        lst += li[i]

    lst
    
#방법1
>>> li = []
    for values in df.values.tolist():
        for value in values:
            li.append(value)
    li

#방법2
>>> df.values.reshape(-1).tolist()

#방법3
>>> df.values.flatten().tolist()

#방법4
>>> for i in df.values.tolist():
        for j in i:
            li.append(j)
        
#방법5
>>> [y for x in df.values.tolist() for y in x ]     

* reset_index(drop = True)

새로운 칼럼이 생기는 것을 막아줌

>>> mpg.reset_index()
>>> mpg.reset_index(drop = True)

* apply lambda

lambda 식을 이용할 때 여러 개의 값을 입력 인자로 사용해야할 경우
보통 'map()' 함수를 결합해서 사용한다

map(lambda ...) 은 하나하나의 값에 적용할 수 있고,
apply(lambda ...) 은 하나의 칼럼 전체에 적용할 수 있다

2. 사이킷런으로 시작하는 머신 러닝

일반적으로 머신러닝 모델을 구축하는 주요 프로세스는
①피처 처리(가공, 변경, 추출), ②ML 알고리즘 학습(fit) & 예측 수행(predict), ③모델 평가
의 세 단계를 반복적으로 수행하는 것이다

>>> import sklearn

#버전 확인
>>> sklearn.__version__

#전체 버전 확인
>>> pip list

>>> pip list | findstr sk

* 지도 학습

학습(train)을 위한 다양한 피처와 분류 결정값인 레이블(label) 데이터로 모델을 학습(fit)한 뒤, 별도의 테스트(test) 데이터 세트에서 미지의 레이블(label)을 예측(predict) 한다
즉, 명확한 정답이 주어진 데이터를 먼저 학습한 뒤 미지의 정답을 예측하는 방식이다

학습을 위해 주어진 데이터 세트를 '학습(train) 데이터 세트',
머신러닝 모델의 예측 성능을 평가하기 위해 별도로 주어진 데이터 세트를 '테스트(test) 데이터 세트로 지정한다

-sklearn.datasets : sklearn에서 자체적으로 제공하는 데이터 세트를 생성하는 모듈의 모임
-sklearn.tree : 트리 기반 ML(머신러닝) 알고리즘을 구현한 클래스의 모임
-sklearn.model_selection : 학습 데이터와 검증 데이터, 예측 데이터로 데이터를 분리하거나 최적의 하이퍼 파라미터(=가중치)로 평가하기 위한 다양한 모듈의 모임
(하이퍼 파라미터 : 머신러닝 알고리즘별로 최적의 학습을 위해 직접 입력하는 파라미터들을 통칭하는 말, 머신러닝 알고리즘 성능을 튜닝할 수 있다)

-DecisionTreeClassifier(): 대문자로 시작 -> class, 의사 결정 트리 알고리즘을 구현한 클래스(분류기)

-train_test_split() : 데이터 세트(피처, 레이블)를 학습 데이터와 테스트 데이터의 두 조각으로(75%, 25%) 나눈다

(1) 붓꽃 품종 예측하기 (분류 Classification)

붓꽃 dataset로 붓꽃의 품종을 '분류' 해보자
붓꽃 데이터 세트 : 꽃잎의 길이와 너비, 꽃받침의 길이와 너비의 총 4가지 피처를 기반으로 꽃의 품종(레이블)을 예측

피처 : 속성, 특질, 칼럼, 변수 ...

① 붓꽃 데이터 세트의 피처와 데이터 값 확인

>>> from sklearn.datasets import load_iris

#붓꽃 데이터 세트 로딩
>>> load_iris()    #dataset의 형태
>>> iris = load_iris()
	iris
    
#key값
>>> iris.keys()
    
>>> iris
	type(iris)
#type가 dict는 아니지만, dict와 같은 형태이므로 dict라고 봐도 무관하다
#Bunch 클래스는 dict 형태와 유사하다

>>> iris.values()
	iris.items()

② 데이터 분리 --> train_test_split()

학습용 데이터(train)와 테스트용 데이터(test)는 반드시 분리해야 한다
학습 데이터로 학습된 모델이 얼마나 뛰어난 성능을 가지는지 평가하려면 데스트 데이터 세트가 필요하기 때문이다

>>> from sklearn.tree import DecisionTreeClassifier
	from sklearn.model_selection import train_test_split

#접근 : key 값을 입력하면 그 key에 맞는 value값을 출력해준다
>>> iris['data']

>>> iris_data = iris['data']     #피처 데이터 값
    iris_label = iris['target']    #label : '이름' 이라는 의미

>>> train_test_split(iris_data, iris_label)
#train_test_split() : 두 조각으로(75%, 25%) 나눈다

>>> X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label)
#총 4조각이 된다
#X : 피처 데이터 세트, y : 레이블 데이터 세트

>>> y_test

③ 학습(fit)과 예측(predict) 수행

  • 학습 .fit()
    fitting : 패턴을 찾는다, 학습한다, 적합하다, 훈련하다
    X_train에 있는 값으로 y_train 값을 예측(패턴분석)
    X_train과 y_train의 데이터 개수가 같아야 한다 -> .shape 로 확인
#DecisionTreeClassifier(): 대문자로 시작 -> class (의사 결정 트리 클래스)
>>> dt_clf = DecisionTreeClassifier()

>>> dt_clf.fit(X_train, y_train)
#.fit() : X_train과 y_train의 패턴을 분석하고, dt_clf에 저장한다

>>> X_train.shape    #.shape -> (row의 개수, column의 개수)
>>> y_train.shape
  • 예측 .predict()
    학습된 모델 기반에서 테스트 데이터 세트에 대한 예측값을 반환한다
>>> X_test.shape
>>> dt_clf.predict(X_test)
>>> y_test

#X_test와 y_test 의 값 비교(예측)
>>> y_pred = dt_clf.predict(X_test)
    y_pred == y_test
    
>>> sum(y_pred == y_test)

>>> iris['target_names']
  • 예측 성능 평가 (정확도 측정 -> accuracy_score())
    정확도는 예측 결과가 실제 레이블 값과 얼마나 정확하게 맞는지를 평가하는 것
>>> from sklearn.metrics import accuracy_score
>>> accuracy_score(y_test, y_pred)   #두 함수를 비교해서 몇개 맞았는지 확인 (정확도)

(2) 사이킷런의 기반 프레임워크

* Estimator 클래스, fit(), predict() 메서드

사이킷런은 ML 모델 학습을 위해 fit()을, 학습된 모델의 예측을 위해 predict() 메서드를 제공한다
분류 알고리즘을 구현한 클래스를 Classifier, 회귀 알고리즘을 구현한 클래스를 Regressor 로 지칭하며, 이 둘을 합쳐서 Estimator 클래스라고 부른다
지도학습의 모든 알고리즘을 구현한 클래스를 통칭해서 Estimator 라고 부른다

* 내장된 예제 데이터 세트

사이킷런에 내장된 데이터 세트는 일반적으로 '딕셔너리' 형태로 되어있다
key는 보통 data, target, target_name, feature_names, DESCR 로 구성되어 있다

data 피처의 데이터 세트 / ndarray
target 레이블 값(분류), 숫자 결과값(회귀) / ndarray
target_name 개별 레이블의 이름 / ndarray or list
feature_names 피처의 이름 / ndarray or list
DESCR 데이터 세트와 각 피처에 대한 설명

분류나 회귀 연습용 예제 데이터
-회귀 용도
datasets.load_boston()
datasets.load_diabetes()

-분류 용도
datasets.load_breast_cancer()
datasets.load_digits()
datasets.load_iris()

(3) Model Selection 모듈

① train_test_split() : 학습, 테스트 데이터 세트 분리

테스트 데이터 세트를 이용하지 않고 학습 데이터 세트로만 학습하고 예측하면 정확도가 100%로 나온다
이는 이미 학습한 학습 데이터 세트를 기반으로 예측했기 때문이다
답을 알고 있는 상태에서 시험을 본 것과 마찬가지이다
따라서 예측을 수행하는 데이터 세트는 테스트 데이터 세트여야 한다

"train_test_split(피처 데이터 세트, 레이블 데이터 세트, ...)"

두 개의 데이터 세트 외에 선택적으로 받는 파라미터
-test_size : 전체 데이터 세트에서 테스트 데이터 세트의 크기 (디폴트값 : 0.25)
-shuffle : 데이터 분리 전에 데이터를 미리 섞을지에 대한 여부 (디폴트값 True)
-> 데이터를 분산시켜 좀 더 효율적인 학습 및 테스트 데이터 세트를 만듬
-random_state : 호출할 때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수 값(=seed값), 이를 지정하지 않으면 수행할 때마다 다른 데이터가 생성될 수 있다

(4) 데이터 전처리

NaN, Null값 처리
고정된 다른 값으로 변환해야 한다 (평균값으로 대체 또는 아예 drop)

데이터 인코딩
사이킷런의 머신러닝 알고리즘은 문자열 값을 입력값으로 허용하지 않는다
모든 문자열 값을 인코딩해서 숫자형으로 변환해야 한다

① 데이터 인코딩

  • 레이블 인코딩 : 카테고리 피처를 코드형 숫자값으로 변환
>>> from sklearn.preprocessing import LabelEncoder
	encoder = LabelEncoder()
    
>>> encoder.fit(['TV', '냉장고', '전자레인지'])

>>> encoder.fit_transform(['TV', '냉장고', '전자레인지'])
array([0, 1, 2], dtype=int64)

0개의 댓글