본문 바로가기
AI & Data Analysis/인공지능 스터디

[모두의 딥러닝] #5장: 참 거짓 판단 장치, 로지스틱 회귀

by 로토마 2022. 1. 19.

로지스틱 회귀 개요
시그모이드 함수, 오차
오차 공식 유도
퍼셉트론 개요

Logistic_regression 실습 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 공부 시간 x와 합격 여부 y의 리스트 만들기 (1: 합격, 0: 불합격)
data = [[2,0],[4,0],[6,0],[8,1],[10,1],[12,1],[14,1]]
 
x_data = [i[0for i in data]
y_data = [i[1for i in data]
# 그래프로 나타내기
plt.scatter(x_data,y_data)
plt.xlim(0,15)
plt.ylim(-.1,1.1)
(-0.11.1)
 
# 기울기 a와 절편 b의 값 초기화
= 0
= 0
# 학습률
lr = 0.05
# 시그모이드 함수 정의
def sigmoid(x):
    return 1/ (1+np.e**(-x))
# 경사하강법 실행
# 1000번 반복될 때마다 각 x_data 값에 대한 현재의 a값, b값 출력
for i in range(2001): # 2000번
    for x_data, y_data in data:
        a_diff = x_data*(sigmoid(a*x_data+b)-y_data)
        b_diff = sigmoid(a*x_data + b) - y_data
        a = a -lr*a_diff
        b = b - lr*b_diff
        if i%1000 == 0:
            print("epoch=%.f, 기울기 =%.04f, 절편 =%.04f" %(i,a,b))
            print(x_data, y_data)
 
x_data = [i[0for i in data] ## 다시 반복문 써서 입력하기
y_data = [i[1for i in data] ## 다시 반복문 써서 입력하기
# 앞써 구한 기울기와 절편을 이용해 그래프 그리기
plt.scatter(x_data,y_data)
plt.xlim(0,15)
plt.ylim(-.1,1.1)
x_range = (np.arange(0,15,0.1))
plt.plot(np.arange(0,15,0.1), np.array([sigmoid(a*x+b) for x in x_range]))
plt.show()
 
 
cs

실습 퀴즈)

타이타닉에서 살아남기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#타이타닉에서 살아남기
#sklearn의 로지스틱 회귀 라이브러리를 이용하여 타이타닉 실제 승객의 데이터를 학습시켜보고, 직접 다른 데이터를 넣어 생존자를 예측해보자.
#image.png
 
import pandas as pd
import numpy as np
 
#사이킷런의 로지스틱 회귀 라이브러리
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
data = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')
 
data.head(10)
'''
Survived    Pclass    Name    Sex    Age    Siblings/Spouses Aboard    Parents/Children Aboard    Fare
0    0    3    Mr. Owen Harris Braund    male    22.0    1    0    7.2500
1    1    1    Mrs. John Bradley (Florence Briggs Thayer) Cum...    female    38.0    1    0    71.2833
2    1    3    Miss. Laina Heikkinen    female    26.0    0    0    7.9250
3    1    1    Mrs. Jacques Heath (Lily May Peel) Futrelle    female    35.0    1    0    53.1000
4    0    3    Mr. William Henry Allen    male    35.0    0    0    8.0500
5    0    3    Mr. James Moran    male    27.0    0    0    8.4583
6    0    1    Mr. Timothy J McCarthy    male    54.0    0    0    51.8625
7    0    3    Master. Gosta Leonard Palsson    male    2.0    3    1    21.0750
8    1    3    Mrs. Oscar W (Elisabeth Vilhelmina Berg) Johnson    female    27.0    0    2    11.1333
9    1    2    Mrs. Nicholas (Adele Achem) Nasser    female    14.0    1    0    30.0708
 
'''
 
# null 값 확인
data.isna().sum() #결측치 여부확인
Survived                   0
Pclass                     0
Name                       0
Sex                        0
Age                        0
Siblings/Spouses Aboard    0
Parents/Children Aboard    0
Fare                       0
dtype: int64
# 생존 여부에 대한 데이터 분리(label)
label = data['Survived']
 
# 모델 훈련 시 입력 데이터 => 기존 데이터에서 삭제시켜주기
data.drop(labels = ['Name','Survived','Fare'],axis=1,inplace=True)
 
# 성별 데이터를 숫자로 변환 (남자-0, 여자-1)
data['Sex'= data['Sex'].map({'male':0,'female':1})
data 
 
'''
Pclass    Sex    Age    Siblings/Spouses Aboard    Parents/Children Aboard
0    3    0    22.0    1    0
1    1    1    38.0    1    0
2    3    1    26.0    0    0
3    1    1    35.0    1    0
4    3    0    35.0    0    0
...    ...    ...    ...    ...    ...
882    2    0    27.0    0    0
883    1    1    19.0    0    0
884    3    1    7.0    1    2
885    1    0    26.0    0    0
886    3    0    32.0    0    0
887 rows × 5 columns
 
'''
 
#train 데이터와 test 데이터 분리
train_input, test_input,train_label, test_label =train_test_split(data,label,random_state=42)
모델 생성 및 학습
model = LogisticRegression() #sklearn에서 제공
 
#모델 훈련
model.fit(train_input,train_label) # 모두 train set으로 훈련
 
#예측 확인
print(model.predict(test_input)) 
 
# 출력 값에서 0이 사망자, 1이 생존자
 
'''
[0 0 0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 1 1 0 0
 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0
 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 1
 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 0 1
 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0]
 
'''
 
#정확도
print(model.score(train_input, train_label))
 
#가중치(W) 확인 가중치가 클수록 생존확률에 영향을 많이 준다.
print(data.head(0))
print(model.coef_)
 
# 절댓값을 적용해 가중치 크기를 확인 후, 어떤 것이 생존 확률에 가장 큰 영향을 미치는지 확인
# => 성별 -> 등급 순
 
'''
0.8090225563909774
Empty DataFrame
Columns: [Pclass, Sex, Age, Siblings/Spouses Aboard, Parents/Children Aboard]
Index: []
[[-1.22033116  2.72464597 -0.04117579 -0.38049401 -0.05352014]]
'''
 
# 임의의 값 넣어보기
# Jack : 남성,20세,3등석
# Rose : 여성,17세,1등석
# 데이터 순서 [등석, 성별, 나이, 형제 수, 부모 수]
 
# Jack
pred =model.predict([[3,0,20,0,0]])
 
if(pred[0== 0):
    print('AI : 사망하실 것으로 예측됩니다.\n')
else:
    print('AI : 생존하실 것으로 예측됩니다.\n')
 
print('생존확률 / 사망확률 : {}'.format(model.predict_proba([[3,0,20,0,0]])))
 
 
# Rose
pred =model.predict([[1,1,17,0,2]])
 
if(pred[0== 0):
    print('AI : 사망하실 것으로 예측됩니다.\n')
else:
    print('AI : 생존하실 것으로 예측됩니다.\n')
 
print('생존확률 / 사망확률 : {}'.format(model.predict_proba([[1,1,17,0,2]])))
 
#나
pred =model.predict([[1,1,20,1,2]])
 
if(pred[0== 0):
    print('AI : 사망하실 것으로 예측됩니다.\n')
else:
    print('AI : 생존하실 것으로 예측됩니다.\n')
 
print('생존확률 / 사망확률 : {}'.format(model.predict_proba([[1,1,20,1,2]])))
cs

 

https://github.com/emilyjiminroh/2022_ai_winter_study/blob/main/chapter_5

 

GitHub - emilyjiminroh/2022_ai_winter_study: 모두의 딥러닝 교재를 바탕으로 AI Study

모두의 딥러닝 교재를 바탕으로 AI Study. Contribute to emilyjiminroh/2022_ai_winter_study development by creating an account on GitHub.

github.com