사이킷런이란?
• 파이썬을 활용한 머신러닝도구
• 데이터분석(예측)을 위한 간단하고 효율적인 도구
• 누구나쉽게 다양한 상황에서 활용가능
• 오픈소스
사이킷런으로할수있는것
-분류(ex.스팸메일)
-회귀(ex.가격)
-클러스터링(ex.고객세그먼트)
-차원축소(ex.변수(컬럼)의수를줄임)
-모델선택(ex.모델튜닝,평가)
-전처리(ex.데이터가공/변환)
# 데이터 생성
import pandas as pd
import numpy as np
data = pd.DataFrame({
'메뉴': ['[인기]아이펠치킨','닭강정','간장치킨','마늘치킨','파닭','승일양념치킨','양념반후라이드반','황금후라이드','[베스트]풀잎치킨'],
'가격': [16000,15000,14000,14000,14000,13000,13000,12000,9900],
'호수' : [11,12,9,9,11,10,10,10,10],
'칼로리' : [1200.0,1500.0,1600.0,1800.0,1300.0,1400.0,1300.0,1000.0,1000.0],
'할인율' : [0.5,0.2,0.2,0.2,0.2,0.2,0.2,0.2,np.nan],
'할인가' : [8000.0,12000.0,11200.0,11200.0,11200.0,10400.0,10400.0,9600.0,np.nan],
'원산지' : ['국내산','브라질','국내산','국내산','브라질','국내산','국내산','국내산','국내산'],
'살찔까요' : ['no','yes','yes','yes','yes','yes','yes','no','no'],
'고민' : ['무조건먹자','먹지말자','먹지말자','먹지말자','먹지말자','먹지말자','먹지말자','무조건먹자','무조건먹자']
})
data.to_csv('final_modudak.csv', index=False)
data
# 데이터 변경
data.loc[2,'원산지'] = '미국'
data
# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df
레이블 인코딩(Label Encoding)과 원핫 인코딩(One-hot Encoding)은 범주형 데이터를 수치형 데이터로 변환하는 방법입니다.
레이블 인코딩은 각 카테고리를 숫자로 대응시켜서 변환합니다. 예를 들어, "red", "green", "blue"라는 3개의 카테고리가 있다면 "red"를 1로, "green"을 2로, "blue"를 3으로 변환하는 것입니다. 이 방법은 간단하고 직관적이지만, 각 카테고리가 가지는 값의 크기 차이가 있을 경우 예측 결과에 영향을 미칠 수 있습니다.
반면에, 원핫 인코딩은 각 카테고리를 벡터 형태로 변환합니다. 예를 들어, "red", "green", "blue"라는 3개의 카테고리가 있다면 "red"는 [1, 0, 0], "green"은 [0, 1, 0], "blue"는 [0, 0, 1]로 변환하는 것입니다. 이 방법은 각 카테고리를 독립적인 변수로 취급하기 때문에 각 카테고리가 가지는 값의 크기 차이를 고려하지 않습니다. 따라서, 범주형 변수의 카테고리가 많을수록 차원이 커지는 단점이 있지만, 예측 결과에 영향을 미치는 위험이 적습니다.
따라서, 레이블 인코딩은 카테고리가 서열을 가지는 경우(예: "bad", "average", "good")나 카테고리의 수가 적을 경우에 사용하고, 원핫 인코딩은 카테고리의 수가 많을 경우에 사용합니다.
• df.info()
[리마인드] 판다스의 자료형
• object(문자열) : 예) '호수'
• int64(정수) : 예) 10
• float64(실수) : 예) 12.12
• le.fit_transform(df['컬럼명'])
*한번에 fit과 transform 변환
# type확인
df.info()
# 레이블(label) 인코딩
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(df['원산지'])
le.transform(df['원산지'])
# fit_transform
# fit과 transform을 한번에!
le.fit_transform(df['원산지'])
# 데이터 변환
df['원산지'] = le.fit_transform(df['원산지'])
df
# '살찔까요' 레이블인코딩
le = LabelEncoder()
df['살찔까요'] = le.fit_transform(df['살찔까요'])
df
# 활용할 데이터 선택 - 원본 데이터 불러오기
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df
# 데이터가 object 타입인 column 선택 ['원산지', '살찔까요']
# 방법1
cols = ['원산지', '살찔까요']
# 방법2 : object(문자열) 타입의 컬럼명만 cols 변수에 할당하게 됨
cols = df.select_dtypes(include='object').columns
• 자료형에 담긴 자료들을 하나씩 꺼내고 싶을때 사용한다.
• 이렇게 반복문을 활용해서 실행을 하게 되면 컬럼이 아무리 많아도 반복문을 통해서 한번에 인코딩 할 수 있다.
# 한 번에 레이블 인코딩
from sklearn.preprocessing import LabelEncoder
for col in cols:
le = LabelEncoder()
df[col] = le.fit_transform(df[col])
# 인코딩 결과 확인
df
• 각 카테고리별로 컬럼을 만들어서 해당되는 카테고리의 컬럼은 1,
나머지 컬럼은 0으로 인코딩
# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df
# 원핫인코딩
# 데이터프레임을 입력받기 때문에 대괄호를 2번 써야 합니다. (df[['원산지']])
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse=False)
cat = ohe.fit_transform(df[['원산지']])
cat
# 카테고리
ohe.categories_
# 피처(컬럼)이름과 카테고리
ohe.get_feature_names_out()
# 데이터프레임으로 변환
df_cat = pd.DataFrame(cat, columns=ohe.get_feature_names_out())
df_cat
# 데이터 프레임 합치기
df = pd.concat([df,df_cat],axis=1)
df
# 기존 컬럼 삭제
df = df.drop(['원산지'], axis=1)
df
• 여러 개 컬럼 한 번에 인코딩
# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df
# 원핫인코딩
cols = df.select_dtypes(include='object').columns
ohe = OneHotEncoder(sparse=False)
cat = ohe.fit_transform(df[cols])
df_cat = pd.DataFrame(cat, columns=ohe.get_feature_names_out())
df_cat
# 데이터프레임 합치기
df = pd.concat([df, df_cat], axis=1)
df.head()
# 컬럼 삭제
df = df.drop(cols, axis=1)
df
# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df.head()
# 판다스를 활용한 원핫 인코딩
df = pd.get_dummies(df)
df
표준화 (StandardScaler)
• 모든값을 평균이 0, 분산이 1인 표준정규분포로 변환
�=�−��z=σx−μ
정규화 (MinMaxScaler)
• 모든값을 0~1 사이 값으로 변환 (데이터 사이즈 축소)
• dataset.feature_names
• dataset.target
• dataset.data[:2]* 2세트만 확인시
-변수명= pd.DataFrame(data=dataset.data , columns=dataset.feature_names)
• cancer_df['target'] = dataset.target
• load로 시작하는 함수를 이용해 데이터를 불러올 수 있다.
• import sklearn.datasets
• sklearn.datasets.all* 언더바가 연달아 2개
-사이킷런의 train_test_split 라이브러리를 활용하면 쉽게 train set(학습데이터셋)과 테스트셋을 랜덤하게 나누어 준다.
-학습용으로 70%를 두고 30% 데이터는 테스트용으로 둔다.
-반복 연산시 일정하게 섞기 위해 사용하며 random값을 고정하여 동일한 결과를 얻을 수 있다.