df = pd.read_csv('Data.csv')
df
Country Age Salary Purchased
France | 44.0 | 72000.0 | No |
Spain | 27.0 | 48000.0 | Yes |
Germany | 30.0 | 54000.0 | No |
Spain | 38.0 | 61000.0 | No |
Germany | 40.0 | NaN | Yes |
France | 35.0 | 58000.0 | Yes |
Spain | NaN | 52000.0 | No |
France | 48.0 | 79000.0 | Yes |
Germany | 50.0 | 83000.0 | No |
France | 37.0 | 67000.0 | Yes |
NaN 처리
(NaN에 평균값 대입)
df.fillna(df.mean(), inplace=True)
X, Y 데이터 분리 : 즉 학습할 변수와 레이블링 변수로 분리
# x를 종속변수
# y를 독립변수
X = df.loc[ : , 'Country' : 'Salary' ] # 2차원 행렬이라 대문자로
X
CountryAgeSalary0123456789
France | 44.000000 | 72000.000000 |
Spain | 27.000000 | 48000.000000 |
Germany | 30.000000 | 54000.000000 |
Spain | 38.000000 | 61000.000000 |
Germany | 40.000000 | 63777.777778 |
France | 35.000000 | 58000.000000 |
Spain | 38.777778 | 52000.000000 |
France | 48.000000 | 79000.000000 |
Germany | 50.000000 | 83000.000000 |
France | 37.000000 | 67000.000000 |
y = df['Purchased'] # 1차원 데이터라 소문자로
X['Country'].describe() # 카테고리컬 데이터라고 확인 unique 3.
count 10
unique 3
top France
freq 4
Name: Country, dtype: object
X['Country'].unique()
array(['France', 'Spain', 'Germany'], dtype=object)
# 문자로 되어있는 데이터는 방정식에 대입할 수가 없다.
# 따라서 문자를 숫자로 바꿔줘야 하는데
# 먼저 해당 문자열이 카테고리컬 데이터인지 확인한다.
# 카테고리컬 데이터면 정렬한다.
# 정렬한 후의 문자열들을 앞에서부터 0부터 시작한 숫자로 변환한다.
# 이것이 가장 기본적인 방법인데, 이를 Label Encoding 이라고 한다.
sorted(X['Country'].unique())
['France', 'Germany', 'Spain']
# France : 0 , Germany : 1, Spain : 2
# 3개 이상의 카테고리컬 데이터는 레이블 인코딩으로 학습을 시키면
# 학습이 잘 되지 않는 것을 발견
# 따라서 2개의 카테고리컬 데이터는 레이블 인코딩을 사용해도 되지만
# 하지만 3개 이상의 카테고리컬 데이터는 one-Hot Encoding을 사용해야 성능이 좋아진다.
# France Germany Spain
# 1 0 0 => 프랑스인 경우는 프랑스만 1로 세팅
# 0 1 0 => 독일인 경우는 독일만 1로 세팅
# 0 0 1 => 스페인인 경우는 스페인만 1로 세팅
# 즉, 카테고리컬 데이터를 전부 컬럼으로 만들어서 해당 컬럼의 값만 1로 세팅하는 것을
# 원핫인코딩이라고 한다.
데이터를 확인해 보니, 컴퓨터가 이해할 수 있도록 바꿔야 한다.
컴퓨터는 숫자로 처리한다.
숫자가 아닌 데이터 중에서, 카테고리로 판단되는 데이터는, 숫자로 바꿔줄 수 있다.
https://azanewta.tistory.com/46
One Hot Encoding 과 Label Encoding 을 비교해보자
One-Hot Encoding이란 무엇인가. 언제 우리는 Label Encoding 대신 One-Hot Encoding을 써야하는가? 데이터 과학에 일반적인 인터뷰 질문이며, 데이터 과학자는 반드시 알아야 하는 내용이다. 결론적으로 당신
azanewta.tistory.com
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# 1. 레이블 인코딩하는 방법
encoder = LabelEncoder()
X['Country'] = encoder.fit_transform(X['Country']) <==넘파이
# 2-1. 원 핫 인코딩 하는 방법
from sklearn.compose import ColumnTransformer <== 넘파이
X = df.iloc[ : , 0 : 2+1]
ct = ColumnTransformer([('encoder', OneHotEncoder(), [0])], remainder='passthrough')
# 0이라고 쓴 이유는? X에서 원핫인코딩할 컬럼이
# 컴퓨터가 매기는 인덱스로 0이기 때문에 0이라고 썼다
# 만약에 Salary 컬럼도 원핫인코딩한다고 가정하면
# [0, 2] 라고 컴퓨터가 매기는 인덱스를 추가로 적어주면 된다.
# 원핫 인코딩이 수행된 컬럼은, 항상 행렬의 맨 왼쪽에 나온다.
X = ct.fit_transform(X)
X
array([[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.40000000e+01,
7.20000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 2.70000000e+01,
4.80000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 3.00000000e+01,
5.40000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.80000000e+01,
6.10000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 4.00000000e+01,
6.37777778e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.50000000e+01,
5.80000000e+04],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00, 3.87777778e+01,
5.20000000e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 4.80000000e+01,
7.90000000e+04],
[0.00000000e+00, 1.00000000e+00, 0.00000000e+00, 5.00000000e+01,
8.30000000e+04],
[1.00000000e+00, 0.00000000e+00, 0.00000000e+00, 3.70000000e+01,
6.70000000e+04]])
y
0 No
1 Yes
2 No
3 No
4 Yes
5 Yes
6 No
7 Yes
8 No
9 Yes
Name: Purchased, dtype: object
y.describe()
count 10
unique 2
top Yes
freq 5
Name: Purchased, dtype: object
sorted(y.unique())
['No', 'Yes']
y= encoder_y.fit_transform(y)
y
array([0, 1, 0, 0, 1, 1, 0, 1, 0, 1])
Dataset을 Training 용과 Test용으로 나눈다.
# 숫자로 다 변환된 X와 y 를
# 학습용 데이터와 테스트용 데이터로 나눈다.
# 그 결과는 총 4개의 데이터가 나온다. 그림참고
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)
X.shape
(10, 5)
X_train.shape
(8, 5)
'AI 이론 > Machine Learning' 카테고리의 다른 글
빅데이터 관련 홈페이지 모음 (0) | 2021.11.29 |
---|---|
[머신러닝] 타임시리즈 : Facebook의 Prophet() 활용 (0) | 2021.11.29 |
[머신러닝] COUNT VECTORIZER (0) | 2021.11.26 |
Feature Scaling (StandardScaler, MinMaxScaler) (0) | 2021.11.23 |
[머신러닝] 입문 (0) | 2021.11.23 |