1주차는 회귀 2주차는 분류
선형회귀로 풀 수 없는 '분류' 문제들은 논리회귀로 풀 수 있다
선형회귀의 결과는 직선그래프/ 논리회귀의 결과는 곡선 그래프
ex) n%의 확률로 fail(0)/pass(1) 한다고 예측할 수 있음
임계치(threshold)는 필요에따라 조정할 수 있음
전처리(preprocessing): 머신러닝의 70-80%를 차지하는 부분 raw data를 가공하는 일
정확도에 영향을 많이 미치기때문에 아주아주 중요한 부분!
입력 ▶ 선형모델 ▶ 시그모이드 ▶ 출력
단항 논리회귀와 다른 점: 라벨(클래스)이 여러개!
클래스의 갯수만큼 배열을 0으로 채운다 ▶ 각 클래스의 인덱스 위치에 1을 넣는다
분류를 잘 할 수 있는지 = 선을 잘 그을 수 있는지를 생각하면 쉽다
➜ 선형/논리 모델로 해결이 안될 때 사용해보면 좋다
단위를 맞추고 예외사항들을 지워준다(아웃라이어 제거)
두가지 모두 학습속도(최저점 수렴 속도)를 향상시켜주고 그래프의 굴곡을 작게 만들어 로컬 미니멈에 빠질 가능성을 낮춰준다
https://www.kaggle.com/heptapod/titanic
import os
os.environ['KAGGLE_USERNAME'] = 'username' # username
os.environ['KAGGLE_KEY'] = 'key' # key
!kaggle datasets download -d heptapod/titanic
!unzip titanic.zip
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam, SGD
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 전처리 과정(표준화)
df = pd.read_csv('train_and_test2.csv')
# 사용할 컬럼 추출하기
df = pd.read_csv('train_and_test2.csv', usecols=[
'Age', # 나이
'Fare', # 승차 요금
'Sex', # 성별
'sibsp', # 타이타닉에 탑승한 형제자매, 배우자의 수
'Parch', # 타이타니게 탑승한 부모, 자식의 수
'Pclass', # 티켓 등급 (1, 2, 3등석)
'Embarked', # 탑승국
'2urvived' # 생존 여부 (0: 사망, 1: 생존)
])
df.head(5)
# 원하는대로 잘 바뀌었는지 확인
# 숫자가 아닌 값이 있는지 확인
print(df.isnull().sum())
# 비어있는 행 없애기
df = df.dropna()
# 머신러닝을 위한 데이터는 문자/null값이면X
# 반드시 숫자여야하므로 빈값이 포함된 행을 제거한다
# 간단하게 데이터셋 미리보기
sns.countplot(x='Sex', hue='2urvived', data=df)
# 클래수 갯수 확인하기
sns.countplot(x=df['2urvived'])
# X, Y 데이터 분할하기
x_data = df.drop(columns=['2urvived'], axis=1)
# x값으로는 결과값인 '생존여부'를 제외하고 모두이므로 이에 해당하는 칼럼만 제외시켜준다
x_data = x_data.astype(np.float32) # 소수점 32비트
y_data = df[['2urvived']]
y_data = y_data.astype(np.float32)
# 표준화하기
scaler = StandardScaler()
x_data_scaled = scaler.fit_transform(x_data)
# x 데이터만 단위가 다 다르니까 표준화 작업을 한다
print(x_data.values[0])
print(x_data_scaled[0])
# 첫번째 인덱스에 해당하는 값으로 잘 바뀌었는지 확인
# 학습/검증 데이터 분할하기
x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021)
# print(x_train.shape, x_val.shape)
# -> (1045, 7) (262, 7)
# 1045개로 학슴, 262개로 검증 7은 칼럼 수
model = Sequential([
Dense(1, activation='sigmoid')
])
# 결과물은 하나, 리니어 실행 후 시그모이드 실행
model.compile(loss='binary_crossentropy',
# 논리회귀는 바이너리 크로스엔트로피를 손실함수로 사용한다
optimizer=Adam(lr=0.01), metrics=['acc'])
# 논리회귀는 로스값만 봐서는 얼마나 학습이 잘 됐는지 알기 어렵기때문에
# 분류 문제를 풀 땐 metrics를 사용한다
# acc 는 정확도를 나타내고, 0-1 사이의 값을 가진다
model.fit(
x_train,
y_train,
validation_data=(x_val, y_val),
epochs=20
)
https://www.kaggle.com/datasets/brynja/wineuci
이전 과정은 모두 동일
-데이터셋 로드
df = pd.read_csv('Wine.csv')
df.head(5)
➜ 데이터프레임의 헤더가 누락되어있음
df = pd.read_csv('Wine.csv', names=[
'name'
,'alcohol'
,'malicAcid'
,'ash'
,'ashalcalinity'
,'magnesium'
,'totalPhenols'
,'flavanoids'
,'nonFlavanoidPhenols'
,'proanthocyanins'
,'colorIntensity'
,'hue'
,'od280_od315'
,'proline'
])
df.head(5)
sns.countplot(x=df['name'])
encoder = OneHotEncoder()
y_data_encoded = encoder.fit_transform(y_data).toarray()
print(y_data.values[0]) #y data의 첫번째 행의 값을 가져온 것
print(y_data_encoded[0])
print(y_data.values[1]) # 그러니까 0,1,2 모두 name이 1로 값이 같으니까 모두 동일하게 [1.],[1. 0. 0.]이 나옴
print(y_data_encoded[1])
print(y_data.values[176]) # 뒤에 name=3인게 나오면 [3.][0. 0. 1.] 이렇게 잘 나옴 ㅋㅋㅋ []안에 들어가는건 당연히 인덱스인데!
print(y_data_encoded[176])
x_train, x_val, y_train, y_val = train_test_split(x_data_scaled, y_data_encoded, test_size=0.2, random_state=2021)
print(x_train.shape, x_val.shape) #(142, 13) (36, 13) 13은 feature의 갯수
print(y_train.shape, y_val.shape) #(142, 3) (36, 3) 3은 와인의 종류(1,2,3)
model = Sequential([
Dense(3, activation='softmax')
]) #출력이 3개(와인 종류)니까 3, 다항이니까 소프트맥스
model.compile(loss='categorical_crossentropy',
# 다항이니까 손실함수 categorical_crossentropy
optimizer=Adam(lr=0.02), metrics=['acc'])
# 학습시키기
model.fit(
x_train,
y_train,
validation_data=(x_val, y_val), # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
epochs=20
)
➜ val_acc 와인 종류를 나누는 정확도 94%
다항 논리 회귀에서 데이터를 학습시킬 때
/usr/local/lib/python3.7/dist-packages/keras/optimizer_v2/adam.py:105: UserWarning: The lr
argument is deprecated, use learning_rate
instead.
❗ 해결learning_rate로 고쳐쓰면 오류는 안나는데 그래도 강의자료랑 값이 다르게 나온다
아래는 왜 같이 출력되는지 모르겠다
super(Adam, self).init(name, **kwargs)
https://www.kaggle.com/datasets/mathchi/diabetes-data-set
데이터셋 미리보기
클래스 갯수 확인하기
비어있는 행 확인
X,Y 데이터 분할하기
표준화
-> 이렇게 - 값이 나와도 되나?????????????????? 답안에도 데이터가 0인 부분은 마이너스로 나와있긴한데....흠..?
학습시키기