머신러닝

선형회귀, 다항회귀, 로지스틱 회귀

content0474 2024. 10. 14. 16:33

1. 선형회귀

종속변수와 독립변수간의 관계를 직선으로 모델링

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
 
X = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5],[6,6]])
y = np.array([1, 2, 3, 4, 5, 6])
이렇게 생긴 데이터
x는 특성(features, 즉 입력데이터)인데, X를 보니 특성을 2차원 배열로 나열한 특성행렬이다.
y는 목표(target, 즉 출력값)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) train_test_split은 데이터를 적당히 분할해서 일부는 학습용, 일부는 테스트용으로 쓰게 한다.
train_test_split(독립변수, 종속변수, 테스트비율, 랜덤스테이트)
현재 테스트비율은 20% 즉 데이터의 80%는 학습에, 20%는 테스트에 쓰도록 해두었다.
랜덤스테이트에 따라 데이터셋을 랜덤하게 분할한다.
model = LinearRegression()
model.fit(X_train, y_train)
linear regression 모델을 자동으로 생성하고,
fit(학습데이터, 학습정답)을 넣으면 자동으로 학습한다.
이 때 이 모델은 주어진 데이터 y=x1=x2 를 학습하게 된다.
y_pred = model.predict(X_test) predict 함수를 호출하고 안에 테스트하고자 하는 독립변수를 넣음
X_test 참고로 어떤X를 테스트용으로 썼는지 보면
결과: array([[1,1], [2,2]])
y_pred 결과: array([1., 2.]) 이거는 1.0과 2.0이라는 뜻이다.
y_test y_test가 정답인데, 예측한 값이 정답과 같아야 하므로 마지막으로 확인을 해주면
결과: array([1, 2]) 로 동일하다.

데이터 값이 x든 y든 다 똑같아서 조금 헷갈렸기에 y= 3*x1 = (3/2)*x2 의 관계인 데이터를 넣어서 만들어봤다. 

 

2. 다항회귀

다항회귀는 쉽게 말해 n차 방정식(n>1)이다. 변수간의 관계를 곡선형태(비선형관계)로 모델링하는 방법이다.

선형회귀랑 거의 비슷한데, 몇 가지 차이가 있다.

 

from sklearn.preprocessing import PolynomialFeatures

 

poly=PolynomialFeatures(degree=2)

 -> 입력데이터에 2차 다항식 특성을 추가함 즉 x와 x^2이라는 두 항이 추가됨

 

X_poly=poly.fit_transform(X)

 ->fit() 과 transform()을 동시에 수행함

fit()은 데이터를 기반으로 통계적 정보를 계산하는 과정인데, 이 경우 x와 x^2을 생성하는데 필요한 규칙을 설정하는 과정이 일어남

transform()은 fit()에서 설정된 규칙에 따라 입력값을 변환하는 작업 

 

이에 따라 출력된 X_poly는 다음과 같이 구성되어 있다.

[1, x값, x^2값] 여기서 1은 상수항이다.

이제 이렇게 만들어진 X_poly를 train_test_split에 독립변수로서 넣어준다.

이후 모델을 학습시키먄 y=x^2을 학습하게 된다. 학습과 결과내는 과정은 선형회귀와 동일하다.

 

3. 로지스틱 회귀: 결과값이 둘 중 하나일 때 사용할 수 있음

3-1. breast cancer data

data = load_breast_cancer()

이것은 데이터를 불러오는 또 다른 방식인데, sklearn 라이브러리에서 제공하는 유방암 데이터를 불러올 수 있다.

 

X = data.data

앞쪽의 data 는 유방암 데이터를 의미하고

.data는 가져온 데이터의 입력데이터를 의미한다. 여기에는 세포 크기, 염색체 수 등 총 30개의 변수가 있다.

y = data.target

.target은 유방암 데이터에서 우리가 예측하려는 값 즉, 목표값(labels) 이다. 이는 양성(0) 또는 악성(1)의 두 가지 결과로 나타난다.

그리고 데이터 스케일링을 해줘야 한다.

StandardScaler()는 평균0, 표준편차1로 변환하는 표준화

X_train과 X_test의 차이를 보면,  X_train은 fit_transform을 하는데 X_test는 transform만 했다.

이는 X_train의 평균과 표준편차를 계산하고, 그것을 이용해서 표준화를 한 다음,

X_test는 X_train의 평균과 표준편차를 이용해서 표준화함을 의미한다.

 

이를 바탕으로 학습하고 예측하는 방법은 회귀분석과 동일히다.

 

3-2. 타이타닉 데이터

여기서는 데이터를 불러오고 전처리하는 부분에 집중할텐데, 

이렇게  seaborn에서 데이터를 불러올수도 있다.

우선 NaN값이 있는 것들은 분석에 방해가 되므로 전부 없애주고

 

문자열로 되어 있는 것을 수치로 바꾸는 인코딩 작업을 해줬다.

이 때의 map()은 pandas의 map으로, 파이썬 내장 map()과는 다른것이다.

pandas의 map()은 series객체에서 값을 변환할 때 사용하며, 변환 시 딕셔너리나 함수를 이용한다. 이를 매핑이라고도 한다.

위 예시는 'sex'칼럼에서 male은0, female은1로 변환하는 딕셔너리를 이용해 sex칼럼의 값을 바꿔주고 있다.

 

잠깐! series 객체란?

pandas 라이브러리에서 1차원 배열을 나타내는 데이터구조로, 이를 통해 데이터 프레임에서 각각의 열을 다룰 수 있다. series는 인덱스와 값으로 이루어져 있다. list와 비슷하지만, 각 값에 대해 인덱스가 붙어있다는 점이 다르다.

 

참고로, 파이썬 내장 map은 반복가능한 객체의 각 요소에 동일한 함수를 적용해야 할 때 유용하게 쓴다.

map(int, input().split())  이 코드를 보자

input().split()은 입력된 문자열을 공백으로 나누어서 리스트로 받는다. 예를 들어 '3000 400 50' 라고 입력했다면 [3000, 400, 50] 이라는 리스트로 받게 된다. 이 때 리스트 내 각각의 요소인 3000,  400, 50을 모두 정수형태 데이터로 바꿔주고 싶으면 map(int, [3000, 400, 50]) 을 쓰면 된다.

 

survived는 우리가 예측해야 하는 값이기 때문에 입력값에서는 없애준다.