y = wx + b 이게 기본공식
Xor 이 안돼는 조금 뒤떨어진 알고리즘 (기초로 공부), multi layer perceptron으로 사용하면 된다 하더라
Perceptron
: X 입력값, y 출력값 , w 가중치, b 바이어스
X * w 가 인공 뉴런에 보내지고, 이 값이 임계치를 넘는지 안넘는지에 따라서
0,1 혹은 -1,1로 구별
AND 게이트
두개의 입력값 x1, x2 각각이 0 또는 1의 값을 가질 수 있지만
모두 1인 경우에만 y가 1이 나옴
x1 =0 , x2 =0 -> y =0
x1 =1 , x2 =0 -> y =0
x1 =0 , x2 =1 -> y =0
x1 =1 , x2 =1 -> y =1
NAND 게이트 : AND 게이트의 반대
머신러닝 : 퍼셉트론 같은 알고리즘이 수 십 개 있음.
알고리즘 분류 :
-데이터 분류 : 지도학습 (정답이 필요! _레이블 작업에 사람의 손길이 필요) // 예측과 분류
비지도학습 (컴퓨터가 알아서 분류) ~> 분류된 데이터를 사람이 정리 // 군집화, 분포추정
강화학습 (학습하면서 좋은 쪽으로 향하게 패널티를 줌) // ex) 자율주행
사이킷런 ->python 라이브러리 (머신러닝 해줌)
python 이용한 머신러닝
1. 경사하강법
2. 회귀기법 : 선형회귀, 로지스틱 회귀
3. 확률기반 : 나이브 베이즈 분류기, 은닉 마르코프 모델
4. 기하기반 : SVM(Support Vector Machine), kMC, kNN
5. 인공신경망 : Perceptron, Multi Layer Perceptron, Deep Neural Network
SVM : 경계선에 선을 쭉 그음, 그 선에 마진 값을 줘서 겹치지 않는 데이터를 분류함
사이킷런 치트시트** (어떤 알고리즘 사용할지 알려주는 것)
Perceptron class 만들기
class 만들 때, __init__(self, ...) 습관처럼 쓰는데 그 이유는?
초기값 준다고 생각하기
global 로 전역변수 가져와서 def에 사용할 수 있나??
변수명 뒤에 _ 붙이면 : 외부에서 건들지 말라는 뜻
23 줄 self.w_ = np.zeros(1+X.shape[1]) 여기서 1을 넣은 이유는 바이어스 값도 같이 담기 위해
w_ : weight (가중치)
가중치 뜻 : 력신호가 결과 출력에 주는 영향도를 조절하는 매개변수
편향(bias) : 절편? 뉴런(x)이 얼마나 쉽게 활성화(return 1)되느냐를 조정하는(adjust) 매개변수
list(), [] 중 오른쪽을 쓰면 늙은이? 왼쪽도 사용 가능
zip(), 패키지, 언패키지, 이 둘을 이용해서 앞뒤 값 바꾸는 방법 등.. 까먹지 말자
int(True) ~> 1
np.where(조건, t, f)
import numpy as np
class Perceptron :
# 생성자
# 생성할 때 자동으로 생성되는 얘 __init__ , 자동으로 초기화 시킬 애를 만들려면 얘 꼭 집어 넣기
# 클래스 쓰는 이유
# thresholds : 임계값, 계산된 예측값을 비교하는 값 (0하고 비교)
# eta : 학습률 _> 자동이 안돼서 직접 하나씩 넣어서 분석해야함
# n_iter : 학습 횟수
def __init__ (self, thresholds = 0.0, eta = 0.01, n_iter = 10):
self.thresholds = thresholds
self.eta = eta
self.n_iter = n_iter
# 학습 함수 (훈련)
# 보통 y는 답(벡터)여서 소문자, X는 대문자로 씀
def fit(self, X, y):
# 가중치를 담는 행렬 생성
# _ 외부에서 건드리지 마라
# 가중치를 담는 행렬 생성 ( +1 한 것은 바이어스(절편)도 같이 담기위해)
self.w_ = np.zeros(1 + X.shape[1])
# 예측값과 실제값 비교한 결과 중 다른 예측값의 개수를 담을 리스트
self.errors_ = []
# 지정된 횟수 만큼 학습 반복
for _ in range(self.n_iter):
# print('반복')
# 예측 값과 실제 값이 다른 개수를 담을 변수
errors = 0
# 입력받은 입력 값과 결과 값을 묶어 준다.
temp1 = zip(X,y)
# 입력 값의 수 만큼 반복
for xi, target in temp1:
#입력 값을 가지고 예측 값을 계산
a1 = self.predict(xi)
# 입력 값이 예측값이랑 다르면
# 가중치를 계산한다.
if target != a1: # y가 예측값 (1,-1)과 같지 않을 경우 학습
update = self.eta * (target - a1) # 얼마나 기울어 줄지 * (y-(1 or -1))
self.w_[1:] += update * xi
self.w_[0] += update # 바이어스
# 값이 다른 횟수를 누적
# int(True) == 1
errors += int(update != 0.0)
# 값이 다른 횟수 값을 배역에 넣기
self.errors_.append(errors) #에러 발생 횟수 추가
print('bias weight1 weight2 : ',self.w_)
# 가중치 * 입력값의 합을 계산
# X : 입력값
def net_input(self, X):
# 각 자리의 값과 가중치(w, a)를 곱
# y = ax + b
a1 = np.dot(X, self.w_[1:]) + self.w_[0] # np.zeros(1 + X.shape[1])로 +1 해줘서 사이즈 맞춰줌 (바이어스도 보여주기 위해서)
return a1
# 예측된 결과값 판단 (액티베이션 평션)
# X : 입력값 배열
def predict(self, X):
# net_input(X)가 0보다 크면 1, 아니면 -1
a2 = np.where(self.net_input(X) > self.thresholds, 1, -1)
return a2
!pip install --upgrade (패키지파일) 로 업그레이드 자주 시켜주기
버전 관리 힘쓰고, env(가상환경) 나눠서 몇개 만들어 두기
머신러닝에 자주 쓰는 라이브러리들
numpy, scipy, matplotlib, scikit-learn, pandas
scipy(과학계산)
sklearn 에서 자주 쓰는 것들
# 학습 데이터
from sklearn import datasets
# 데이터를 학습용과 테스트용으로 나눌 수 있는 함수
from sklearn.model_selection import train_test_split
# 데이터 표준화
from sklearn.preprocessing import StandardScaler
# Perceptron 알고리즘
from sklearn.linear_model import Perceptron
# 모델 평가 함수 (정확도)
from sklearn.metrics import accuracy_score
모델델 저장 용
# 모델 저장용
import pickle
import numpy as np
Perceptron 학습 방법
1. get_data
2. learning
3. using
sklearn 활용 예시 (iris 데이터)
1. get_data
def step1_get_data():
#아이리스 데이터 추출
iris = datasets.load_iris()
# print(type(iris))
# print(iris.data)
# print(iris.target_names)
# print(iris.target)
# 꽃잎 정보 추출
X = iris.data[:100, [2, 3]]
y = iris.target[:100]
return X, y
step1_get_data()
2. learning
** 1. 값이 잘 안나오면 데이터 정리 or 더 찾아서 가공하기 (이게 제일 우선!!!)
** 2. 학습 시킬 데이터와 테스트 용 데이터 나누기
***** 3. 표준화 일반화 작업 차이가 거의 없더라도 꼭 해주기
** 4. 학습 조건과 동일한 조건으로 테스트를 해야함
def step2_learning():
X, y = step1_get_data()
# 학습 데이터와 테스트 데이터 분리
# 이건 train, test 그냥 이대로 넣어주면 됨
X_train, X_test, y_train, y_test = \
train_test_split(X, y, test_size=0.3, random_state = 0) # random_state는 꼭 사용할 것 (값이 위치 떄문에 바뀌는 것인지 아니면 실제로 바뀌는지 확인하기 위해서)
# 표준화, 일반화 작업 습관 처럼 꼭 해주기!!!!!** (값 자체는 별로 차이는 안 나지만, 나중에 문제 생길 수 있음!!)
# 표준화 작업 :
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
# 학습
# 파라미터들을 바꾸면 데이터가 좋아지긴 함 (데이터가 아주 정제가 잘 되었을 때, 이를테면 94%를 95%로 바꿀 때)
# 값이 잘 안나오면 데이터 정리가 먼저임!!!!!!!!!!!!!!!!!*************
ml = Perceptron(eta0 = 0.01, max_iter = 40, random_state = 0)
ml.fit(X_train_std, y_train)
# 학습 정확도 확인
# 학습 시킬 때 사용하지 않은 데이터로 확인 해야함 (test, train 나눠서 사용하기)
# 학습 할 때 데이터와 똑같은 조건으로 테스트를 해야함
X_test_std = sc.transform(X_test) #표준화!!!
y_pred = ml.predict(X_test_std)
# 학습 정확도 확인
X_test_std = sc.transform(X_test)
y_pred = ml.predict(X_test_std)
print('학습 정확도 : ', accuracy_score(y_test, y_pred))
# 학습 모델 저장
with open('perceptron_scikit.model','wb') as fp:
pickle.dump(sc, fp)
pickle.dump(ml, fp)
print('학습 완료')
step2_learning()
결과가 정확도가 1.0이 나오면 과적합 상태로 데이터 다시 확인해봐야함
0.95~0.98 정도로 나오면 제일 best
3. using
def setp3_using():
with open('perceptron_scikit.model', 'rb') as fp:
sc = pickle.load(fp)
ml = pickle.load(fp)
while True:
a1 = input('꽃잎의 길이를 입력 하세요. : ')
if a1 == '999':
break
a2 = input('꽃잎의 너비를 입력 하세요. : ')
X = np.array([[float(a1), float(a2)]]) # 2차원으로 받아야함!!
X_std = sc.transform(X)
result = ml.predict(X_std)
# print(result)
if result[0] == 0: # 리스트로 return 함 (0,1) 로 출력됨
print('결과 : Iris-setosa')
else :
print('결과 : Iris-versicolor')
setp3_using()
실행 됐는지 확인, 오류 확인, 이상한지, 확인
머신러닝 : 퍼셉트론 같은 알고리즘이 수 십 개 있음.
알고리즘 분류 :
-데이터 분류 : 지도학습 (정답이 필요! _레이블 작업에 사람의 손길이 필요) // 예측과 분류
비지도학습 (컴퓨터가 알아서 분류) ~> 분류된 데이터를 사람이 정리 // 군집화, 분포추정
강화학습 (학습하면서 좋은 쪽으로 향하게 패널티를 줌) // ex) 자율주행
python 이용한 머신러닝
1. 경사하강법
2. 회귀기법 : 선형회귀, 로지스틱 회귀
3. 확률기반 : 나이브 베이즈 분류기, 은닉 마르코프 모델
4. 기하기반 : SVM(Support Vector Machine), kMC, kNN
5. 인공신경망 : Perceptron, Multi Layer Perceptron, Deep Neural Network
SVM : 경계선에 선을 쭉 그음, 그 선에 마진 값을 줘서 겹치지 않는 데이터를 분류함
사이킷런 치트시트** (어떤 알고리즘 사용할지 알려주는 것)
'복습용 기술공부' 카테고리의 다른 글
23.03.02 공부 복습 (0) | 2023.03.02 |
---|---|
230228 Decision Tree, Random Forest (0) | 2023.02.28 |
230227 복습 용 정리 Logistic_Regression, KNN (0) | 2023.02.27 |
230224 데이터 정의와 알고리즘 3개(선형회귀, 로지스틱회귀, SVM) (1) | 2023.02.24 |
통계와 빅데이터 공부 내용 메모 (0) | 2023.02.22 |