boot camp day10

HIROYOSHI·2022년 2월 11일
0

2022/2/11

Data Analysis (Regression analysis.)

오늘은 회귀분석을 공부했습니다.

선형회기

사이킷런을 활용한 간단한 선형회귀 해보았습니다.

from sklearn.linear_model import LinearRegression

사이킷런의 리니어모델중 선형회귀를 import해주었습니다.

X=[[163],[179],[166],[169],[171]] # 독립변수 = feature = 속성 
y=[54,63,57,56,58]  # 종속변수

regr = LinearRegression()
regr.fit(X,y)

LinerRegression을 regr에 할당해주고 fit메소드를 이용하여 독립변수 X와 종속변수 y를 넣어주면 학습을 시킵니다.

#직선의 기울기
coef = regr.coef_

#직선의 절편
intercept = regr.intercept_

#학습된 직선이 데이터를 얼마나 잘 따르나
score = regr.score(X,y)


print ("y={}*X+{:.2f}".format(coef.round(2),intercept))
print("데이터와 선형회귀 직선의 관계점수:{:.1%}".format(score))

regr을 학습시켜줬으면 선형직선의 기울기를 regr.coef_ 를 이용하여 coef에 할당할 수 있고 직선의 절편도 똑같이 할당을 해줄 수 있습니다.

또 학습된 적선이 데이터를 얼마나 잘 따르는지 score를 이용하여 관계점수를 얻을 수 있습니다.

# 학습데이터를 입력으로 하여 예측값을 계산한다.
X1=[[180],[182],[186],[171]]
y_pred= regr.predict(X)
y_pred1= regr.predict(X1)
print(y_pred)
print(y_pred1)

학습된 데이터를 통해 임의의 독립변수를 predeit함수에 넣어주어 예측값을 도출해낼 수 있습니다.
아래는 위 코드를 통해 얻게된 결과들입니다.
[54.09375 62.59375 55.6875 57.28125 58.34375][63.125 64.1875 66.3125 58.34375]

평균 제곱 오차, 평균 절대 오차

평균 제곱 오차는 제곱에 대해 평균을 취한 것입니다. 이 값이 작을 수록 원본과의 오차가 적은 것이므로 추측한 값의 정확성이 높은 것입니다.

평균 절대 오차는 각 측정값과 실제값 사이의 절대 오차를 모두 구하는 것으로 측정값과 실제값의 절대 오차들을 모두 더하고 이를 절대 오차의 갯수로 나누면 구할 수 있습니다.

from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error

A = np.array([0.9, 1.3, 3.3, 3.8])
B = np.array([0.5, 1.9, 3.4, 4.4])
y = np.array([1, 2, 3, 4])


print('A의 평균 제곱 오차 = ', mean_squared_error(A,y))
print("A의 평균 절대 오차=", mean_absolute_error(A,y))

print('B의 평균 제곱 오차 = ', mean_squared_error(B,y))
print("B의 평균 절대 오차=", mean_absolute_error(B,y))

사이킷런의 import mean_squared_error, mean_absolute_error 라는 각각의 평균 제곱 오차와 평균 절대 오차를 구하여주는 메소드입니다.

항공기의 승객수 예측하기

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression  

# seaborn에서 제공하는 flights 데이터세트를 로딩
flights = sns.load_dataset('flights')

X = flights['year'].values	#독립변수
y = flights['passengers'].values #종속변수
X=X[:,np.newaxis]	#독립변수를 2차원으로 만들어줌

regr = LinearRegression()
regr.fit(X,y)	#데이터 학습

coed = regr.coef_
intercept = regr.intercept_
score = regr.score(X,y)	#선형회귀 점수 확인

print("y = {}* X + {:.2f}".format(coef.round(2), intercept))
print("선형회귀 모델의 계수: {}".format(coef))
print("선형회귀 모델의 절편: {:.2f}".format(intercept))
print("데이터와 선형회귀 점수: {:.1%}".format(score))

plt.figure(figsize=(5,4))
plt.scatter(X,y)	#산점도 그리기
plt.plot(X , regr.predict(X) , color="r")	#막대그래프 그리기
plt.scatter([1961] , regr.predict([[1961]]) , color="r")	# 1961년 데이터를 추가하여 학습된 모델에 넣어 승객예측을 하여 산점도에 추가하기
plt.show()

위와같은 코드를 실행하면 원래 데이터에 없던 1961년 데이터가 찍혀있는 산점도 그래프를 볼 수 있습니다. 선형회귀를 고등학교를 다닐때 관심이 있다가 대학교와서 본적이 없었는데 부트캠프에서 데이터를 분석하는 도중에 만나게 돼서 반가웠고 배우고 싶었던 공부라서 열심히 들었지만 회귀라는 어려운 내용을 한번에 배우려고 하니까 조금의 과부화가 왔었습니다.. 하지만 최대한의 데이터를 머리속으로 집어넣을 수 있어서 의미있는 시간이었습니다.

다중회귀

기대수명 예측하기

세계보건기구(World Health Organization, WHO)에서 발표한 나라별 기대수명 데이터
2000년~2015년 사이의 나라별 기대수명, 보건 예산, 질병 통계, 비만도 등
출처: Kaggle https://www.kaggle.com/kumarajarshi/life-expectancy-who/home

Country: 국가명
Year: 2000년부터 2015년까지의 연도
Status: Developed(선진국) or Developing(개발도상국) status
Life expectancy: 기대수명(나이)
Adult Mortality: 15세~60세사이의 성인 1000명당 사망자수
infant deaths: 유아 1000명당 사망자수
Alcohol: 1인당 알콜 소비량
percentage expenditure: GDP 대비 보건 예산 지출비율(%)
Hepatitis B: 1세 아동의 B형 간염 예방 접종률(%)
Measles: 인구 1000명당 홍역 예방 접종률(%)
BMI: 전인구 평균 체질량 지수
Under-five deaths: 5세이하 아동 1000명당 사망자수
Polio: 1세 아동의 소아마지 면역률(%)
Total expenditure: 정부 총예산 대비 보건 분야 예산(%)
Diphtheria: 1세 아동의 디프테리아 예방 접종률(%)
HIV/AIDS: HIV/AIDS 감염상태로 태어남 0-4세 인구 1000명당 사망자수
GDP: 1인당 GDP
Population: 국가 총인구
thinness 1-19 years: 1-19 세 청소년 중 저체중 비율
thinness 5-9 years:5-9세 사이의 아동의 저체중 비율 Income composition of resources: 소득 구성에 따른 인간개발지수
Schooling: 학교 재학 연수

데이터 가져오고 분석.

import pandas as pd

file='/content/life_expectancy.csv'

life=pd.read_csv(file)

life.corr().round(3)	# 상관도가 높은 데이터를 살펴보기 좋게 보여줌 , round 소숫점 올림
#수치는 눈으로 보기 불편함으로 히트맵으로 보기편하게 그려주기

import seaborn as sns
import matplotlib.pyplot as plt

sns.set(rc={'figure.figsize':(22,20)})
correlation_matrix=life.corr().round(2)
sns.heatmap(data=correlation_matrix,annot=True)

#기대수명과 관련이 높은 데이터를 sort를 통해 보여줌
import numpy as np
c=np.abs(life.corr().round(2)['Life expectancy'])
print(c.sort_values(ascending=False)[1:6])

선형회귀 모델 구성 및 평가

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split # 평가를 하기위해 데이터를 나눠주는 툴

c=np.abs(life.corr().round(2)['Life expectancy'])
highcorr = c.sort_values(ascending=False)[0:4].index # 기대수명+상위5개, 총 6개

X=life[highcorr[1:]]
y=life['Life expectancy']


X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2) # 20%는 테스트데이터로 사용

regr=LinearRegression()

regr.fit(X_train,y_train)

print('선형회귀모델의 점수=', regr.score(X_test,y_test).round(3))

위와같은 코드를 돌리면 선형 회귀 모델을 만들고 학습한 뒤 학습이 잘 됐는지 출력을 해줍니다.

다항회귀도 배웠지만 다음 벨로그에 다루어보도록 하겠습니다.

고우영박사님

인공지능, 로봇공학, 보안전문가

( 배운점들:
인공지능을 하기위해서는 프로그래밍을 할 줄 알아야함

로봇을 하기위해서는 C,Python Embedded 필수

컴퓨터 비전 == 사물인식

ROS(로봇 운영 체제)에 강화학습을 접목시켜서 공부하면 모든곳에 취업할 수 있음

CISO(정보보안 최고 책임자)하면 연봉 2억 가능

war game == 해킹을 연습할 수 있는 웹

해킹은 해외자료가 많고 국내 자료가 적다.)

profile
KNU COMPUTER ENGINEERING

0개의 댓글