반응형

# 일변량(단일 변수?) 비시각화 탐색

## 요약통계량 확인하기

df.describe()                        # 수치형 칼럼 요약통계표(count, mean, std, min, 25%, 50%, 75%, max)

df.describe(include='all')     

# 수치형이 아닌 칼럼도 요약통계표 보여줌, unique(고유한 데이터의 수, top(최빈값), freq( 최빈갓의 갯수)

 

## 빈도표 확인하기

df['airline'].value_counts()

 

 

# 다변량(변수 여러개?) 비시각화 탐색

## 상관계수 확인 : 두 변수 간의 선형 상관관계를 계량화한 수치, -1~1 사이 값, 0에 가까울수록 상관 없음

df.corr()

## 특정 컬럼만 지정하면 상관관계를 더 잘 파악할 수 있음(class가 economy인 좌석만 지정하면 남은 날짜와 가격 사이에 음의 상관관계를 가짐)

df_eco=df[(df['class']=='Economy')]

df_eco.corr()

 

##교차표 확인하기 : 범주형 데이터의 상관관계를 확인하는 방법(cf 상관계수는 수치형 데이터의 상관관계)

pd.crosstab(df['source_city'],df['departure_time'])

 

 

# 시각화로 데이터 탐색

반응형

# 데이터프레임 변형하기
# 그룹화 하기
airline_group = flight.groupby('airline')

 

airline_group.groups            # 그룹화 된 것 확인
airline_group.count()           # 데이터 갯수 확인
airline_group.size()            # 집단별 크기
airline_group.sum()             # 숫자데이터 합계
airline_group.mean()            # min, max, mean, std, var(분산),  가능

airline_group.mean()[['price']]   # 특정 컬럼을 지정해서 숫자 계산하기

 

# 복수의 컬럼을 기준으로 groupby 해서 다중 인덱싱 설정하기
flight.groupby(['airline','arrival_time']).min()

 

# 여러개의 컬럼을 groupby 하여 새로운 데이터프레임 생성하기
mul_airline_group=flight.groupby(['airline','arrival_time'])
mul_airline_group.mean()

 

# loc 을 이용하여 원하는 인덱스의 데이터만 가져오기
mul_airline_group.mean().loc[[('AirAsia','Evening')]]

 

# 인덱스로 그룹화 하기
## set_index로 인덱스 설정하기
indexed_flight = flight.set_index(['airline','arrival_time']) # 그룹화 된 것은 아님
indexed_flight

 

flight.set_index(['airline','arrival_time']).groupby(level=[0]).mean()   # 첫번째 인덱스로 그룹화 한 것
flight.set_index(['airline','arrival_time']).groupby(level=[0,1]).mean()   # 두 개의 인덱스 모두로 그룹화 한 것

flight.set_index(['airline','arrival_time']).groupby(level=[0,1]).aggregate([np.mean, np.max]) # aggregate로 집계하기

 

# 피벗테이블 생성하기

# pivot_table과 pivot 명령은 동일한 동작을 하는데, pivot은 중복값이 있을 때 오류남

flight.pivot_table(index = 'source_city', columns = 'destination_city', values = 'price')

 

 

# concat으로 병합하기

#  ignore_index 옵션, True : 기존 인덱스 무시하고 0부터 새로 인덱스 지정

# False : 기존 인덱스 값을 그대로 붙임

pd.concat([df1, df2], ignore_index=True)

 

# axis 옵션, 기본은 axis = 0, 행레벨로 병합(위아래로 붙이기), 옵션 안쓰면 기본

# axis = 1로 지정하면 열레벨로 병합됨(옆으로 붙이기), 이때 두 데이터프레임의 인덱스 맞춰서 병합되고, 데이터가 없는 인덱스는 NaN으로 합쳐짐

pd.concat([df1, df2], axis = 1)

 

# join 옵션 outer(합집합), inner(교집합)

# outer로 하면 한쪽만 있는 것도 합치고

# inner로 하면 양쪽에 다 있는 컬럼만 합침(한쪽만 있는 컬럼은 버림)

pd.concat([df1, df2], join='inner')

 

# verify_integrity 옵션 : 두 데이터프레임에 중복인 인덱스가 있는지 검사하고 메시지 주는 옵션

# true로 하면 인덱스가 중복인 경우 오류메시지 발생

pd.concat([df1, df2], verify_integrity=True)

 

# Merge/Join으로 데이터 병합하기 - 특정한 key를 기준으로 데이터를 병합할 수 있음

## (defualt) inner : 일치하는 값이 있는 경우만 데이터를 가져옴

##  left : 왼쪽 데이터프레임을 기준으로 오른쪽 데이터프레임을 병합(오른쪽 df 에 값이 없으면 NaN)

## right : 오른쪽 df 기준으로 왼쪽 df를 병합

## outer : left와 right를 합한 df를 병합

pd.merge(df1, df2, on='customer_id')   # customer_id가 일치하는 경우만 병합

pd.merge(df1, df2, on='customer_id', how='inner')    # 위와 동일함(기본이 inner)

pd.merge(df1, df2, on='customer_id', how='left')

# df1을 기준으로 df2를 합치는 것, df1에는 있는데 df2에 없으면 NaN, df2에는 있는데, df1에 없으면 병합된 df에 포함시키지 않음

pd.merge(df, df2, on='customer)id', how='right')

반응형

#데이터불러오기
import pandas as pd
import numpy as np

flight=pd.read_csv('./Clean_Dataset.csv', encoding='cp949')
flight

#원하는 컬럼만 가져와서 새로운 데이터로 저장하기
flight2=pd.read_csv('./Clean_Dataset.csv', index_col='stops', usecols=['stops','departure_time','arrival_time','destination_city'])
flight2

#crosstab으로 범주형 데이터 2개를 비교
pd.crosstab(index=flight.source_city, columns=flight.arrival_time)

#데이터 살펴보기
flight.head()    # 상단 5행 보기 (0행부터)
flight.tail()    # 하단 5행 보기
flight.tail(3)   # 볼 행 수 지정하기(n=3 처럼 해도 됨)
flight.shape     # (행, 열)의 갯수를 보여줌
flight.columns   # colums의 이름을 나열해줌
flight.info()    # 각 컬럼 이름, 널이 아닌 데이터 갯수, 데이터 타입을 보여줌(칼럼수, 결측치 등을 한번에 볼 수 있음)
flight.describe() # 데이터 타입이 숫자인 컬럼의 갯수, 평균, 표준편차, 최소값, 1분위/2분위/3분위수, 최대값을 보여줌
flight.dtypes    # 각 컬럽의 데이터 타입을 보여줌
flight['source_city'].value_counts() # 지정한 컬럼에 있는 값의 갯수를 보여줌

#필요 데이터 선택하기
flight[['departure_time']]   # 하나의 컬럼 선택해서 출력하기(대괄호 하나만 있어도 되는데, 이 경우 서식이 없어짐)
flight[['airline','departure_time']]    # 여러개의 컬럼을 선택해서 출력하기 ( 컬럼명에 각각 대괄호 하니까 오류남)
flight[10:21]      # 특정 행을 선택해서 출력하기, [시작:끝] 지정, 슬라이싱, 끝은 포함하지 않음, 10행~20행까지 출력

# 인덱스 새롭게 지정
flight.index = np.arange(100,300253)

flight.loc[[102, 202, 304]]   # 인덱스 번호로 불러옴
flight.iloc[[102, 202, 302]]   # 0 based index 기준으로 불러옴
flight.loc[[102, 202, 302],['airline','flight', 'source_city','price']]    #loc를 사용하여 행과 열의 범위 지정하기
flight.iloc[[102, 202, 302],[1,2,3,11]]   # iloc을 사용하여 행과 열의 범위 지정하기, 컬럼명 사용 시 에러발생
flight[(flight['price']>12000)&(flight['airline']=='Air_India')]   # 조건으로 불러오기

# 조건을 변수로 지정해서 불러오기
price_tag = flight['price'] > 12000
airline_tag = flight['airline'] == 'Air_India'

flight[price_tag & airline_tag].info()

 

# 필요 데이터 변경하기
# 데이터 추가하기
flight['price2'] = flight['price'] * 2
flight['price3'] = flight['price'] + flight['price2']
flight.head()

# 원하는 위치에 데이터 추가하기
# df.insert(loc, column, value, allow_duplicates = False)
# loc(삽입 위치, 0부터 시작), column(삽입될 열의 이름), value(삽입될 열의 값), allow_duplicates(중복 열의 삽입 허용 여부)
flight.insert(10,'duration2', flight['duration']*10)
flight

# 데이터 삭제하기
# axis = 0 (행 레벌로 삭제), axis = 1(열 레벨로 삭제)
flight.drop('price3', axis = 1).head()
flight.drop(index = 100, axis = 0).head()

 

# 이때 drop은 데이터에 저장되지 않음
# 저장하려면 1) 새로운 데이터프레임에 저정하거나, 2) inplace 파라미터를 True로 설정
flight1= flight.drop('price3', axis=1)
flight1
flight.drop('price2', axis=1, inplace=True)
flight

# rename 메소드를 이용하여 칼럼명 변경하기
flight = flight.rename(columns = {'airline': 'airline_name','source_city': 'departure_city'})
flight.head()

# sort_value 메소드와 ascending 매개변수를 이용하여 데이터 정렬하기
flight = flight.sort_values(by = 'Unnamed: 0', ascending=False) # 내림차순 정렬, True로 하면 오름차순 정렬
flight

'Tech' 카테고리의 다른 글

데이터의 이해 - 비시각화/시각화 데이터 탐색  (0) 2024.09.09
그룹화하기, 데이터프레임 병합하기  (0) 2024.09.06
통계학 정리 2  (1) 2024.08.30
통계학 정리  (1) 2024.08.28
Ch8 로지스틱 회귀  (0) 2024.06.27
반응형

t검정

ㅇ t검정이란

   - 두 집단 간의 평균 차이가 통계적으로 의미가 있는지 검정하는 방법

   - 두 집단의 평균 차이를 두 집단의 분산으로 표준화 시킨 값을 통계적으로 검정

ㅇ 언제 사용해?

   - 표본수가 30 이하일 때

   - 모집단의 분산을 모르고 표본분산을 사용하는 경우

ㅇ 절차

   - 귀무가설과 대립가설을 설정

   - 유의수준(알파) 결정 - 양측검정과 단측검정을 결정

   - 검정통계량 계산

   - 조사결과에 대한 유의확률(p값) 계산

   - 결정했던 유의수준과 유의확률을 비교하여 통계적 유의성 판단

반응형

1. 예측방식 유형

   ㅇ 비지도학습(Unsupervised Learning)

      - 군집화/세분화(Clustering) - 요인분석(Factor Analysis), 판별분석(Discriminant Analysis)

      - 연관성 분석(Association Analysis) - 지지도(Support), 신뢰도(Confidence), 향상도(Lift)

   ㅇ 지도학습(Supervised Learning)

      - 회귀분석(Regression Analysis) - 상관분석(Correlation), 분산분석(ANOVA)

      - 분류식별분석(Calssification) - 카이제곱검증

2. 분류식별 검증방법 

   ㅇ 전체 데이터를 학습용(Training)과 검증용(Test)로 무작위 추출(Random Sampling)

      - 학습용 데이터 : 70% 정도, 패턴 파악/학습으로 예측 성능 향상

      - 검증용 데이터 : 30% 정도, 학습한 패턴이 나오는지 검증하는 용도

 

1. 분포를 나타내는 값 : 분산, 표준편차, 범위, 사분위수, 백분위수

ㅇ 편차 : 각 데이터의 값 - 평균값    

     편차의 합은 항상 0

ㅇ 분산 : 편차 제곱의 평균

     산식 = 편차 제곱의 합 / 데이터의 갯수

     분산 자체로 절대적 의미를 갖지 않음, 산포의 크고 작음을 나타냄

ㅇ 표준편차 : 분산의 제곱근

     산식 = SQRT(분산)

     각 데이터들이 평균으로부터 떨어진 평균거리

ㅇ 범위 : 최대값과 최소값의 차이

ㅇ 사분위수 : 작은 값으로 부터 25%까지를 1사분위수, 50%를 2사분위수, 75%를 3사분위수

 

2. 그래프

ㅇ 막대그래프

ㅇ 꺽은선 그래프 : 시간의 흐름에 따른 변화/경향 파악에 적합

ㅇ 혼합형 그래프 : 막대와 꺽은선 혼합 등

ㅇ 띠 그래프 : 전체 대이터에 대한 각 데이터의 크기를 띠의 길이에 비례하여 표시

ㅇ 원 그래프 : 띠 그래프와 같이 전체 데이터에 대한 각 데이터의 크기를 비율로 표시

ㅇ 산포도 : 두 항목간의 상관관계 파악을 위한 그래프

ㅇ 도수분포표와 히스토그램

   - 도수분포표 : 각 데이터의 개수를 정리한 표, 최소~최대값 사이에 일정한 갯수의 계급을 정하고, 각 계급에 속하는 데이터 도수를 정리

   - 히스토그램 : 도수분포표를 막대그래프로 표현한 것, 계급을 가로축, 도수를 세로축으로 표시하고, 계급의 크기를 가로축에 표현할 수 있음

ㅇ 파레토차트 : 상위 20%의 고객이 전체 매출의 80%를 차지한다는 법칙, 누적분포비율을 선그래프로, 각 항목 값을 막대그래프로 혼합해 그리는 것

 

3. 가설검정과 통계적 추정

3-1. 점추정과 구간추정

3-1-가. 표본조사 개념

   ㅇ 대상모집단(Target Population, 전체)의 일부 또는 전체인 표본모집단(sampled population)의 조건을 정의하고

   ㅇ 표본모집단으로부터 표본(sample)을 추출하고 조사를 진행하여 얻어진 표본의 특성치인 통계량으로 

   ㅇ 대상모집단의 특성인 모수를 추정 및 검정하는 절차

3-1-나. 점추정과 구간추정

   ㅇ 점추정 : 표본을 통해 모수를 추정할 때 추출된 표본을 이용하여 하나의 수치로 모수를 추정하는 것

     예) 고등학생 평균키 : 여자는 161, 남자는 174

     - 평균, 표준편차, 중위수 등을 추정, 추측한 모수에 신뢰도를 나타낼 수 없음

   ㅇ 구간추정 : 모수의 값이 속할 것으로 기대되는 일정한 범위를 이용하여 모수를 추정하는 것

     - 점추정의 신뢰도를 보완하기 위해 구간추정을 사용

     - 모수 추정치와 신뢰도를 함께 구할 수 있음

 

3-2. 신뢰구간

3-2-가. 신뢰구간의 이해

   ㅇ 일정한 확률범위 내에서 모수의 값이 포함된 가능성이 있는 범위, 상한값과 하한값으로 구간을 표시

   ㅇ 표본오차를 고려하여 모집단 평균 뮤가 포함될 확률구간

       - 표본오차 : 표본조사 시 표본 선택 변화에 따라 발생하는 오차

   예) 95% 신뢰수준에서 신뢰구간이 (A, B)라면 모수가 A ~ B 구간에 포함될 확률이 95%라는 의미

3-2-나. 신뢰구간의 계산

   ㅇ 90% 신뢰수준에서의 신뢰구간 : 표본의 평균 +- 1.645 x (표준편차/표본수의 제곱근)

   ㅇ 95% 신뢰수준에서의 신뢰구간 : 표본의 평균 +- 1.96 x (표준편차/표본수의 제곱근)

   ㅇ 99% 신뢰수준에서의 신뢰구간 : 표분의 평균 +- 2.575 x (표준편차/표본수의 제곱근)

 

3-3. 가설 검정과 유의수준

3-3-가. 가설검정의 이해

   ㅇ 가설검정 : 어떤 집단에 대해 어떤 가설을 설정하고, 검토하는 통계적 추론

      - 귀무가설(Null Hypothesis) : 효과가 없다, 차이가 없다, 서로 다르지 않다

      - 대립가설(Alternative Hypothesis) : 효과가 있다, 차이가 있다, 서로 다르다(연구의 대상)

    귀무가설과 대립가설을 동시에 설정하고 귀무가설을 기각할 수 있으면 대립가설이 맞다는 의미임

   ㅇ 귀무가설의 기각여부 판단 방법

      - 유의확률(p-value, significance probability) 확인

      - 검정통계량과 기각역(critical region, rejection region) 확인

3-3-나. 가설검정의 오류

   ㅇ 가설검정 오류란 : 표본의 특성치를 사용하는 과정에서 확률적 오류가 발생함, 표본에서 모수를 추정할때 발생, 귀무가설의 채택/기각 중 하나를 선택할 때 오류 범할 가능성

   ㅇ 가설검정 오류의 종류

      - 1종 : 귀무가설이 참인데 기각하는 오류

      - 2종 : 귀무가설이 거짓인데 채택하는 오류

   ㅇ 유의확률 : 1종 오류를 저지를 확률(p값) / 유의수준 : 1종 오류가 발생할 최대 확률

 

 

 

 

반응형

1) 로지스틱 회귀 이해하기

로지스틱 회귀는 시그모이드(Sigmoid) 함수를 사용하여 데이터를 설명하는 최적의 선으로 답을 찾는 알고리즘

이름은 회귀지만, 분류에 사용

 

S(x) = 1/(1+e^-x) = e^x / (e^x + 1)

 

(1) 시그모이드 함수 만들기

# 넘파이, 그래프 라이브러리
import numpy as np
import matplotlib.pyplot as plt

# 시그모이드 함수 작성
def sigmoid(x):
    
    # numpy.exp() 함수는 밑이 자연상수 e인 지수함수(e^x)로 변환
    return 1/(1+np.exp(-x))

# 함수 테스트용 데이터 생성하기
test=np.array([-1, 0, 1])

# 작성된 함수 확인하기
print(sigmoid(test))
[0.26894142 0.5        0.73105858]

 

(2) 시그모이드 함수 그래프 그리기

# 그래프 적용을 위한 데이터 만들기
sigmoid_x = range(-6, 7)
sigmoid_y = sigmoid(np.array(sigmoid_x))

# 선그래프
plt.plot(sigmoid_x, sigmoid_y, color = 'blue', linewidth = .5)

# 백그라운드 모눈종이
plt.rcParams['axes.grid'] = True
# 선굵기
plt.axvline(x=0, color='black',linewidth=3)

#y축 범위
plt.yticks([0, .5, 1])

plt.show()
 

-6 ~ 6 사이의 값을 0~1 사이의 값으로 변환해주는 로지스틱 함수가 잘 구현되었음

 

 

시그모이드 함수(로지스틱 함수)에 대한 이해하기 좋은 글

시그모이드 함수(sigmoid function) 알아보기 + 미분 : 네이버 블로그 (naver.com)

 

시그모이드 함수(sigmoid function) 알아보기 + 미분

(갑자기 시그모이드 함수를 알아보는 시간!) 이렇게 S자로 처음에는 잠잠하다가 중간에 갑작스럽게 크게 ...

blog.naver.com

 

2) 로지스틱 회귀 실습하기

로지스틱회귀 알고리즘은 sklearn의 linear_model 서브패키지에서 제공하는 LogisticRegression 클래스로 활용 가능함

 

# 데이터 구성하기
# 학습데이터 생성
x_train = [3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
y_train = [0,0,0,0,0,0,0,1,1,1,1,1,1,1]

# 추론을 위한 데이터 생성
x_test = [0,1,2,18,19]
y_test = [0,0,0,1,1]

# 학습데이터 numpy로 변경, 행을 열로 변경
x_train = np.array(x_train).reshape(-1,1)
y_train = np.array(y_train)

print(x_train)
print(y_train)
[[ 3]
 [ 4]
 [ 5]
 [ 6]
 [ 7]
 [ 8]
 [ 9]
 [10]
 [11]
 [12]
 [13]
 [14]
 [15]
 [16]
 [17]]
[0 0 0 0 0 0 0 1 1 1 1 1 1 1]

 

 

(2) 로지스틱 회귀 학습하기

# 로지스틱회귀 라이브러리
from sklearn.linear_model import LogisticRegression

# 로지스틱회귀 생성하기
logi_reg = LogisticRegression()

# 학습하기
logi_reg.fit(x_train, y_train)

#역산을 위한 기울기와 y절편이 있는지 확인하기
print('intercept: ', logi_reg.intercept_)
print('coef: ', logi_reg.coef_)
intercept:  [-11.34126808]
coef:  [[1.19383367]]

학습을 마친 모델에서 선형회귀와 같이 coef와 intercept를 확인할 수 있음

이를 이용해 sigmoid 그래프 그리고, 데이터와 비교해보자

 

(3) 로지스틱회귀 그래프 만들기

# 기울기, 절편을 수동으로 결과 만들기
odd = []
for i in x_train: 
    odd.append((logi_reg.coef_*i)+logi_reg.intercept_)


sigmoid_y = sigmoid(np.array(odd))
sigmoid_y = sigmoid_y.reshape(-1,1)

#역산된 그래프 표시하기
plt.scatter(x_train, y_train, color = 'red')
plt.plot(np.array(x_train), sigmoid_y, color='blue')
plt.rcParams['axes.grid']=True
plt.ylim([-0.1, 1.1])
plt.show()

 

3) 로지스틱 회귀와 선형 회귀 비교

(1) 선형회귀 모델링

# 선형회귀 함수 불러오기
from sklearn.linear_model import LinearRegression

# 선형회귀 생성하기
lr = LinearRegression()

# 학습하기
lr.fit(x_train, y_train)

# coef와 intercept 확인하기
print('coef: ', lr.coef_)
print('intercept: ', lr.intercept_)
coef:  [0.1]
intercept:  -0.4666666666666667
(2) 로지스틱/선형 회귀 비교하기
coef_intercept = x_train * lr.coef_ + lr.intercept_

plt.scatter(x_train, y_train, color = 'red')
plt.plot(np.array(x_train), coef_intercept, color='green')
plt.plot(np.array(x_train), sigmoid_y, color='blue')
plt.show()

x_test = np.array(x_test).reshape(-1,1)

print(logi_reg.score(x_test, y_test))
print(lr.score(x_test, y_test))
 
1.0
0.3981481481481479

 

로지스틱회귀는 y축의 0.5를 기준으로 Yes 또는 No를 구분하여 이진/다중 분류에 강한 모델을 만듦

위 학습모델을 기반으로 x=9.5인 경우 로지스틱/선형 회귀에서 각각 어떤 결과를 도출하는지....

 

'Tech' 카테고리의 다른 글

통계학 정리 2  (1) 2024.08.30
통계학 정리  (1) 2024.08.28
ch8. 사례기반 '''선형회귀모델'''  (0) 2024.06.26
ch8. 지도학습 AI 모델링  (0) 2024.06.25
Ch7. AI 모델링  (0) 2024.06.24
반응형

건강검진 데이터로 LDL콜레스테롤 수치 예측하는 모델 개발하기

 

(1) 데이터 전처리

 

** 데이터 불러오기

#판다스 라이브러리
import pandas as pd
pd.set_option('display.max_columns',None)
#데이터 불러오기
df=pd.read_csv('./건강검진정보.CSV', encoding = 'cp949')
df.head()

 

 

** 불필요한 데이터 삭제하기

# 가설을 참고하여 데이터 일부 삭제하기
df.drop(['치아우식증유무','치석','구강검진수검여부','시력(좌)','시력(우)','청력(좌)','청력(우)', '기준년도'], axis=1, inplace=True)
df.drop(['가입자일련번호','시도코드','성별코드'], axis=1, inplace=True)

 

 

 

** ??

# 테스트 데이터 추출하기
test=df[df['LDL콜레스테롤'].isnull()]
test

 

 

 

** 결측치 제거하고 정답데이터와 정답을 제거한 학습데이터 생성

# NaN데이터를 삭제한 데이터를 train으로 저장하기
train=df.dropna(axis=0)
# 정답데이터 생성
y=train['LDL콜레스테롤']
# 학습데이터 생성하기
x=train.drop('LDL콜레스테롤',axis=1)

 

 

** 정답데이터와 학습데이터를 학습용과 테스트용으로 분리하기

# 라이브러리
from sklearn.model_selection import train_test_split

# 사이킷럿 예시 비율대로 불러오기
x_train, x_test, y_train, y_test=train_test_split(
    x, y, test_size=0.33, random_state=42)

#학습/검증 데이터 확인
print('학습/검증 데이터 확인')
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)
학습/검증 데이터 확인
(225877, 18) (225877,) (111253, 18) (111253,)

 

 

(2) 선형회귀학습 및 추론하기

# 선형회귀 라이브러리
from sklearn.linear_model import LinearRegression

# 모델 생성
reg=LinearRegression()

#학습
reg.fit(x_train, y_train)

#기울기/절편 확인
print(f'''
기울기 coef={reg.coef_}
절편 intercept={reg.intercept_}'''
    )
기울기 coef=[-0.00211547  0.00838286  0.00403974  0.02586561 -0.00362227 -0.00478919
 -0.00181933  0.98893442 -0.18998983 -0.90963871  0.04906444  0.04162509
  0.14300268 -0.00654572  0.00520954 -0.00195242  0.08355305 -0.22383297]
절편 intercept=-7.701480658594335

 

for index, columns in enumerate(x_train.columns):
    print(f"{columns}={reg.coef_[index]}")
연령대코드(5세단위)=-0.002115473657691812
신장(5cm단위)=0.008382856140953354
체중(5kg단위)=0.004039744108514079
허리둘레=0.02586561239950237
수축기혈압=-0.003622269066453412
이완기혈압=-0.004789193384671504
식전혈당(공복혈당)=-0.0018193256235438263
총콜레스테롤=0.9889344164631583
트리글리세라이드=-0.18998982863839742
HDL콜레스테롤=-0.9096387125982928
혈색소=0.049064443694074644
요단백=0.041625090022684406
혈청크레아티닌=0.14300268237983352
혈청지오티(AST)=-0.006545718172646075
혈청지피티(ALT)=0.005209544960069729
감마지티피=-0.0019524161439548294
흡연상태=0.08355304678253972
음주여부=-0.22383296735907002

 

 

(3) 예측을 통한 최종 검증하기

#예측하기
y_pred=reg.predict(x_test)

#결과 검증을 위해 MSE라이브러리 불러오기
from sklearn.metrics import mean_squared_error
rmse=mean_squared_error(y_test, y_pred, squared=False)

# rmse 확인
print(f'''주요 feature 삭제 전 rmse = {round(rmse,3)}''')
주요 feature 삭제 전 rmse = 4.293

 

 

 

(4) 가중치의 의미

#칼럼명 확인
train.columns
Index(['연령대코드(5세단위)', '신장(5cm단위)', '체중(5kg단위)', '허리둘레', '수축기혈압', '이완기혈압',
       '식전혈당(공복혈당)', '총콜레스테롤', '트리글리세라이드', 'HDL콜레스테롤', 'LDL콜레스테롤', '혈색소',
       '요단백', '혈청크레아티닌', '혈청지오티(AST)', '혈청지피티(ALT)', '감마지티피', '흡연상태', '음주여부'],
      dtype='object')

 

기존 분석에서 가중치가 큰 feature를 삭제한 후 rmse가 어떻게 바뀌는지 확인하는것....왜?

#주요 칼럼(feature) 삭제하기
x=x.drop(['총콜레스테롤','트리글리세라이드','HDL콜레스테롤'], axis=1)

# 사이킷럿 예시대로 불러오기
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=.33, random_state=42)

 

 

(5) 선형회귀모델 재학습

lr=LinearRegression()
lr.fit(x_train, y_train)

# 가중치 확인
print(f''' coef
{lr.coef_}
intercept
{lr.intercept_}''')
 coef
[-1.50293683 -0.39035452  0.15513633 -0.20859166 -0.20332664  0.40434892
 -0.13615129  3.43928937 -0.68370857 -2.45956598 -0.08639088  0.06739086
 -0.01048069 -2.77843294  0.15151187]
intercept
170.57752870857038

 

(6) 가중치 비교하기

# 검증데이터로 예측하기
y_pred = lr.predict(x_test)

# 각 데이터에 대해 가중치(회귀계수) 확인
print('가중치 확인')
for index, columns in enumerate(x_train.columns):
    print(f"{columns} = {reg.coef_[index]}")
가중치 확인
연령대코드(5세단위) = -0.002115473657691812
신장(5cm단위) = 0.008382856140953354
체중(5kg단위) = 0.004039744108514079
허리둘레 = 0.02586561239950237
수축기혈압 = -0.003622269066453412
이완기혈압 = -0.004789193384671504
식전혈당(공복혈당) = -0.0018193256235438263
혈색소 = 0.9889344164631583
요단백 = -0.18998982863839742
혈청크레아티닌 = -0.9096387125982928
혈청지오티(AST) = 0.049064443694074644
혈청지피티(ALT) = 0.041625090022684406
감마지티피 = 0.14300268237983352
흡연상태 = -0.006545718172646075
음주여부 = 0.005209544960069729

 

# 주요 Feature 삭제 후의 RMSE 확인하기
RMSE_2=mean_squared_error(y_test, y_pred, squared=False)

# 가중치가 큰 특성을 삭제했을 때 영향을 많이 받는지 확인하기
print(f'''주요 feature 삭제 후 rmse = {round(RMSE_2,3)}''')
주요 feature 삭제 후 rmse = 37.185

 

 

특정 Feature의존재여부에 따라 rmse 값이 매우 크게 차이 나는 걸 확인할 수 있음

'Tech' 카테고리의 다른 글

통계학 정리  (1) 2024.08.28
Ch8 로지스틱 회귀  (0) 2024.06.27
ch8. 지도학습 AI 모델링  (0) 2024.06.25
Ch7. AI 모델링  (0) 2024.06.24
Ch6. 데이터 전처리 - 레이블 인코딩, 스케일링, 변수선택  (0) 2024.06.08
반응형

sec1. 머신러닝

수치형 데이터 : 회귀(시험점수..)

범주형 데이터 : 분류(합/불, Y/S, 고양이/개)

 

1. 사이킷런 라이브러리 기반 학습 및 예측 패턴의 4단계 실행 명령어

   1) 불러오기 : from sklearn.ensemble import RandomForestClassifier

   2) 생성 : clf = RandomForestClassifier(random_state=0)

   3) 학습 : clf.fit(x,y)

   4) 예측 : clf.predict(x)

 

2. 선형회귀

   1) 선형회귀 이해

시계열 그래프 분석, 추세선으로 패턴을 예측하는데 활용하는 것을 회귀분석이라 함

주어진 데이터를 바탕으로 label(Y)과 feature(X)의 관계를 잘 설명하는 모델을 만드는 것이 학습목표

최적의 직선기반 예측 방법론이 선형회귀

   y=ax+b에서 기울기와 y절편 구하기

   2) 선형회귀 실습

sklearn의 LinearRegression 클래스 활용, fit_intercept(절편값 계산여부 지정)하는 하이퍼파라미터 입력

   (1) 데이터 구성하기

#라이브러리 불러오기
import numpy as np
import matplotlib.pyplot as plt

#랜덤시드 고정
np.random.seed(2023)

# x는 1~10, y= 4x+7인 데이터 생성하기
x=[]
y=[]
for i in range(1,11):
    x.append(i)
    y.append(4*i+7)

# 데이터 확인
print('x : ', x)
print('y : ', y)
x :  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y :  [11, 15, 19, 23, 27, 31, 35, 39, 43, 47]

 

(2) 선형회귀 학습하기

#라이브러리 불러오기
from sklearn.linear_model import LinearRegression

#선형회귀 생성하기
reg=LinearRegression()

#학습을 위해 1행 10열 데이터를 10행 1열 데이터로 변경
x=np.array(x).reshape(-1,1)

#데이터 확인
print('x : ', x)
print('x.shape : ', x.shape)
x :  [[ 1]
 [ 2]
 [ 3]
 [ 4]
 [ 5]
 [ 6]
 [ 7]
 [ 8]
 [ 9]
 [10]]
x.shape :  (10, 1)

 

 

#학습하기
reg.fit(x, y)

#기울기, 절편 확인
print('기울기 : ', reg.coef_)
print('y절편 : ', reg.intercept_)

#기울기, 절편 이용 수동계산으로 비교값 생성하기
coef_intercept = x*reg.coef_[0]+reg.intercept_
print(coef_intercept)
기울기 :  [4.]
y절편 :  6.9999999999999964
[[11.]
 [15.]
 [19.]
 [23.]
 [27.]
 [31.]
 [35.]
 [39.]
 [43.]
 [47.]]

 

 

(3) 결과 비교를 위한 그래프 그리기

# x, y 데이터로 scatter plot 그리기
plt.scatter(x, y, color='r', s=20)

# 학습으로 계산한 기울기와 절편을 이용해서 선 그래프 그리기
plt.plot(x, coef_intercept, color='orange')

# 그래프 내에 기울기와 y절편 표시하기
plt.text(7,20,'coef : %.0f'% reg.coef_[0])
plt.text(7,18,'intercetp : %.0f'% reg.intercept_)

plt.ylabel('y')
plt.xlabel('x')

plt.show()

반응형

sec1. AI란

인공지능 > 머신러닝 > 딥러닝

 

  1. 머신러닝

   제공된 데이터를 이용한 학습 → 성능을 반복적으로 평가 → 성능 향상 시키는 것

   데이터를 설명할 수 있는 하나의 함수를 찾는 과정(기울기, y절편)

   임의의 x가 주어졌을 때 y를 예측할 수 있음

 

  2. 딥러닝

   머신러닝에 포함된 기술

   다수의 레이어, 레이어 내부에 다수의 노드, 노드 내부에는 머신러닝 모델

   각 노드는 그물망처럼 연결되어 있고,

   각 노드의 가중치(w)를 구하는 것, 

   최종적으로는 오차를 역전파 해서 w를 재계산해서 성능을 향상시킴

 

sec2. AI학습방법

  1. 지도학습 : 정답(label)을 알려주며 학습 시키는 방법, 회귀/분류로 구분

    - 회귀(Regression) : 양적 데이터

    - 분류(Classification) : 범주형 데이터

  2. 비지도학습 : 정답이 없는 상태로 학습, 레이블이 없기 때문에 결과값이 아닌, 군집화(Clustering) 예측에 사용

      k-means 군집화가 대표적(k는 몇개의 그룹으로 나누는지 선택)

 

sec3. AI모델링 프로세스

  1. AI모델링 프로세스

    데이터 확인 → 데이터 전처리 → AI모델선정 → 학습데이터 분할 → 학습 → 성능평가 --------> 성능향상을 위해 데이터 전처리부터 반복

   1) 데이터 확인 : 사진/영상 등 데이터 구조, 유형, 자연어 처리여부, 결측치/이상치, 중복, 분포도, 레이블링 여부 등

   2) 데이터 전처리 : 중복제거, 결측치 처리, 불필요 데이터 제거 등

   3) AI모델 선정 : 데이터 형태에 따라 AI모델 선정, 회귀/분류 등

   4) 학습데이터 분할

    데이터 세트를 훈련(Train), 검증(Validation), 테스트(Test)로 분할함, 보통 6:2:2 또는 7:2:1 정도

    AI모델은 학습데이터(Train)를 활용해 반복적으로 모델을 생성, 

    각 모델마다 검증데이터를 활용해 성능을 평가(Validation)하고, 그 중 가장 좋은 성능을 가진 모델에 테스트 데이터를 대입해      정확도를 측정함

   5) 모델학습

    선정한 AI모델을 활용해 데이터를 입력, 결과를 예측할 수 있도록 학습하는 과정

   6) 성능평가 : 테스트 데이터를 활용한 성능평가, 목표한 정확도가 안나오면, 데이터 전처리를 추가하거나, AI 모델을 변경하는         등...학습과 성능평가를 반복수행

 

sec4. 학습데이터의 분할

  1. 학습데이터 분할 : 사이킷런 패키지의 train_test_split 함수가 가장 보편적으로 사용됨

입력값(데이터)을 x, 맞춰야 하는 타겟을 y라고 하면, 위 함수는 데이터와 타겟을 분할하고, 테스트 데이터와 검증용 데이터를 분할 함

x_train, x_valid, y_train, y_valid = train_test_split(data, target, test_size=None, 
      train_size=None, random_state=None, shuffle=True, stratify=None)

* test_size : float, int, 기본값은 None, float인 경우 0.0~1.0사이값으로 입력하고, 테스트 데이터의 비율을 나타냄

* train_size : "

* random_state : int, 기본값은 None, 데이터 분할 전에 데이터 shuffle을 제어함, 값을 일정하게 주면, train_test_split을 여러번 수행하더라도 동일하게 분할된 데이터 세트를 활용할 수 있음

* shuffle : True/False, 분할 전에 데이터를 섞을 지 결정함, False인 경우 stratify는 none 이어야 함

* stratify : none/target, target으로 입력하면, 타겟 데이터 분포 비율을 동일하게 갖도록 함

 

  2. k-fold 교차 검증 : 다른 데이터세트로 여러번 평가하면 더 정확한 검증이 가능...

1) k-fold 분할 : 전체 데이터는 k개로 분할

2) 교차검증 : k개로 분할된 데이터를 k번 교차해서 학습(1번 분할을 검증용으로, 2번째는 2번 분할을 검증용으로..)

  

  3. 과적합 : overfitting

테스트 데이터에만 최적화된 모델, 오차(loss)가 늘어나거나, 정확도(Accuracy)가 낮아지는 시점

반응형

sec5. AI모델 평가

1. 분류모델 평가하기

1) 오차행렬

  실제답
Positive Negative
예측값 Positive TP FP
Negative FN TN

* TP(True Positive) : 실제 답이 Positive이고, 예측값도 Positive로 True

* FP(False Positive) : 실제답은 Negative인데, 예측값이 Positive로 False

* FN(False Negative) : 실제답은 Positive, 예측은 Negative로 False

* TN(True Negative) : 실제답은 nega, 예측도 nega로 True

 

평가지표

ㅇ 정확도(Accuracy) : 전체 데이터 중 AI모델이 예측하여 맞힌 비율 = (TP+TN)/(TP+FP+FN+TN)

ㅇ 재현율(Racall) : 실제 Positive 중 AI모델이 Positive라고 예측하여 맞힌 비율 = TP/(TP+FN)

ㅇ 정밀도(Precision) : Positive로 예측한 것 중 실제 Positive인 비율 = TP/(TP+FP)

ㅇ F1-Score : 재현율과 정밀도의 조화평균  = 2*recall*precision / (recall+precision)

 

2) ROC 곡선과 AUC

 

2. 회귀모델 평가하기

1) MAE(Mean Average Error) : 

=sum(|y-yes|)/n 

y : 실제값, yes : 예측값, n : 데이터 수

MAE가 작을수록 성능좋은 모델

 

2) MSE(Mean Squared Error) : 이상치의 영향을 평가하는데 좋음(제곱을 하기 때문에 이상치의 영향도가 커짐)

=sum((y-yes)^2)/n

 

3) RMSE(Root Mean Squared Error)

=sqrt[sum((y-yes)^2)/n]

MSE에 루트한거..

데이터가 많고, 오차가 많은 경우에 이상치 영향이 너무 커지는 것을 방지하기 위해 루트를 적용한거..

 

4) R2 Score : 회귀모델이 얼마나 데이터에 적합한지를 나타내는 지표

R2=1-[sum((t-y)^2)]/[sum((t-ym)^2)] = 1-[오차 제곱의 합]/[편차 제곱의 합]

t : 실제값, y : 예측값, ym : 평균값

R2스코어는 1에 가까울수록 좋은 모델 

0보다 작거나 같으면 예측하기 보다, 그냥 평균으로 쓰면 되는 데이터

 

+ Recent posts