>>> 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()
>>> 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()
>>> 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
>>> 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. 남자인가? -> 예/아니오)
군집 : 맞다 틀리다의 답이 정해져 있지 않음, 유사한 속성을 갖는 데이터를 그루핑
>>> 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 ]
새로운 칼럼이 생기는 것을 막아줌
>>> mpg.reset_index()
>>> mpg.reset_index(drop = True)
lambda 식을 이용할 때 여러 개의 값을 입력 인자로 사용해야할 경우
보통 'map()' 함수를 결합해서 사용한다
map(lambda ...) 은 하나하나의 값에 적용할 수 있고,
apply(lambda ...) 은 하나의 칼럼 전체에 적용할 수 있다
일반적으로 머신러닝 모델을 구축하는 주요 프로세스는
①피처 처리(가공, 변경, 추출), ②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%) 나눈다
붓꽃 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)는 반드시 분리해야 한다
학습 데이터로 학습된 모델이 얼마나 뛰어난 성능을 가지는지 평가하려면 데스트 데이터 세트가 필요하기 때문이다
>>> 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
#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
>>> 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']
>>> from sklearn.metrics import accuracy_score
>>> accuracy_score(y_test, y_pred) #두 함수를 비교해서 몇개 맞았는지 확인 (정확도)
사이킷런은 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()
테스트 데이터 세트를 이용하지 않고 학습 데이터 세트로만 학습하고 예측하면 정확도가 100%로 나온다
이는 이미 학습한 학습 데이터 세트를 기반으로 예측했기 때문이다
답을 알고 있는 상태에서 시험을 본 것과 마찬가지이다
따라서 예측을 수행하는 데이터 세트는 테스트 데이터 세트여야 한다
"train_test_split(피처 데이터 세트, 레이블 데이터 세트, ...)"
두 개의 데이터 세트 외에 선택적으로 받는 파라미터
-test_size : 전체 데이터 세트에서 테스트 데이터 세트의 크기 (디폴트값 : 0.25)
-shuffle : 데이터 분리 전에 데이터를 미리 섞을지에 대한 여부 (디폴트값 True)
-> 데이터를 분산시켜 좀 더 효율적인 학습 및 테스트 데이터 세트를 만듬
-random_state : 호출할 때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수 값(=seed값), 이를 지정하지 않으면 수행할 때마다 다른 데이터가 생성될 수 있다
NaN, Null값 처리
고정된 다른 값으로 변환해야 한다 (평균값으로 대체 또는 아예 drop)
데이터 인코딩
사이킷런의 머신러닝 알고리즘은 문자열 값을 입력값으로 허용하지 않는다
모든 문자열 값을 인코딩해서 숫자형으로 변환해야 한다
>>> from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
>>> encoder.fit(['TV', '냉장고', '전자레인지'])
>>> encoder.fit_transform(['TV', '냉장고', '전자레인지'])
array([0, 1, 2], dtype=int64)