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[0] for i in data]
y_data = [i[1] for i in data]
# 그래프로 나타내기
plt.scatter(x_data,y_data)
plt.xlim(0,15)
plt.ylim(-.1,1.1)
(-0.1, 1.1)
# 기울기 a와 절편 b의 값 초기화
a = 0
b = 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[0] for i in data] ## 다시 반복문 써서 입력하기
y_data = [i[1] for 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
'AI & Data Analysis > 인공지능 스터디' 카테고리의 다른 글
[모두의 딥러닝] #8장: 오차는 다운! 정확도는 업! 오차역전파 (1) | 2022.01.22 |
---|---|
[모두의 딥러닝] #7장: XOR 문제의 극복, 다층 퍼셉트론 (0) | 2022.01.22 |
[모두의 딥러닝] #6장: 가장 작은 인공신경망 단위, 퍼셉트론 (0) | 2022.01.22 |
[모두의 딥러닝] #4장: 오차 수정하기 : 경사하강법 (0) | 2022.01.13 |
[모두의 딥러닝] #3장: 가장 훌륭한 예측선 긋기: 선형 회귀 (1) | 2022.01.08 |