ML/DL: 머신러닝과 딥러닝은 컴퓨터가 데이터를 통해 스스로 규칙을 학습하게 만드는 기술이다.
AI (인공지능)
└─ ML (머신러닝)
└─ DL (딥러닝)
머신러닝/딥러닝 결과가 컴퓨터마다 다른 이유는 알고리즘 본연의 무작위성, 하드웨어 연산 방식의 차이, 소프트웨어 및 라이브러리 버전 차이 등이 있다. 딥러닝에서 하드웨어 차이로 인해 발생하는 1% 미만의 성능 차이는 통제할 수 없는 자연스러운 현상으로 받아들이고, 오차에 집착하기 보다는 전반적인 모델의 성능을 향상시키는데 집중하는 것이 필요하다.
ML이 할 수 있는 것 (잘하는 것)
정형 데이터 분석 및 예측: 엑셀이나 데이터베이스에 깔끔하게 정리된 숫자, 텍스트 데이터를 분석
분류 및 군집화: 스팸 메일을 걸러내거나, 고객을 구매 성향에 따라 몇 가지 그룹으로 나누는 작업
명확한 추천 시스템: 사용자의 과거 클릭 이력, 조회수, 평점 등을 바탕으로 좋아할 만한 콘텐츠
해석 가능성: AI가 왜 이런 결과를 도출했는지 사람이 역으로 추적하고 이해
ML이 할 수 없는 것 (한계점)
비정형 데이터의 독립적 이해: 이미지, 음성, 영상, 긴 줄글 형태의 텍스트 자체를 그냥 던져주면 스스로 이해하지 못한다.
고차원적인 창작: 새로운 글을 지어내거나, 완전히 새로운 이미지를 그려내는 등의 복잡한 생성 작업은 하지 못한다.
딥러닝(Deep Learning, DL): 머신러닝의 한 분야.
인간의 뇌 신경망을 모방한 인공신경망을 층층이 깊게 쌓아(Deep), 기계가 스스로 데이터의 특징을 찾아내도록 하는 방식
DL이 할 수 있는 것 (잘하는 것)
비정형 데이터 처리의 최강자: 사진 속 객체 인식, 음성 인식(STT), 음성 합성(TTS), 자연어 이해 등 복잡하고 규칙이 없는 데이터를 처리하는 데 압도적인 성능
고도의 생성형 AI: 챗GPT처럼 자연스러운 문장을 이어나가거나, 글의 문맥을 파악해 요약하고, 텍스트를 기반으로 새로운 이미지를 만들어내는 등 창작의 영역에 가까운 결과
스스로 특징 추출: 사람이 특징을 지정해주지 않아도, 방대한 데이터를 보면서 스스로 "아 고양이는 귀가 뾰족하고 수염이 있구나"라는 패턴
DL이 할 수 없는 것 (한계점)
적은 데이터로 학습하기 : 데이터가 적으면 아예 제대로 된 학습 결과를 내지 못한다.
과정 설명하기: "왜 이런 결과가 나왔어?"라고 물었을 때 그 이유를 설명하지 못한다.
상식적 추론 : 문맥상 그럴듯한(확률이 높은) 단어를 나열 할 뿐, 인간이 가진 기본적인 '상식'이나 세계관을 이해 하고 논리적으로 사유하는게 아니다.
딥러닝 이론을 프로그래밍 코드로 작성하는 것을 돕는 라이브러리는 텐서플로, 파이토치, 카페, 테아노 등이 있다. 그 중 우리가 사용할것은 바로 텐서플로 이다.
'''
Tensor Flow
Layer [Input]
Layer [Dense]
위와 같은 레이어가 쌓여있는 구조.
독립 종속
-----------
온도 판매량
. .
. .
. .
. .
----------
인풋을 넣었을떄 덴스가 정답과 오차가 있을텐데, 이를 조정하는게 loss 함수
mse(평균제곱오차)를 사용해서 오차를 조절(가중치 조절)
이미지분석 : 보통 2가지가 있음
1. 객체탐지 (ex-Yolo 모델)
2. 세그먼트 탐지
손실함수와 활성함수를 어떨때 뭘 쓰는지를 잘 판단해야함!!
'''
지도학습
# 1 과거의 데이터를 준비한다. (기온과 레모네이드 판매량, 원인 : 독립변수, 결과: 종속변수)
# 2 모델의 구조를 만든다. (온도를 알려주면 판매량을 예측해주는 기계)
# 3 데이터로 모델을 학습(fit)한다.
# 4 모델을 이용한다.
위 방법에 따라 레모네이드 판매를 예측하는 모델을 만들어보자.
레모네이드 판매 예측 실습
온도(레모네이드 온도 아님)에 따른 레모네이드의 판매량을 예측하는 실습을 해보았다.

#라이브러리 사용
import pandas as pd
import tensorflow as tf
#================================
# [1] 레모네이드 판매 예측 모델
#================================
#1. 과거의 데이터를 준비합니다.
path = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/lemonade.csv'
lemonade = pd.read_csv(path)
#독립변수(온도0와 종속변수(판매량) 분리
independent = lemonade[['온도']]
dependent = lemonade[['판매량']]
path는 기온과 판매량 데이터임. 읽어와서 독립변수와 종속변수를 분리한다.
독립변수: 원인
종속변수: 결과
#2. 모델의 구조
X = tf.keras.layers.Input(shape=[1]) # Input(): 데이터가 들어오는 '입구'
Y = tf.keras.layers.Dense(1)(X) # Dense(): 출구 레이어 (1) : 나가는 데이터가 1개
model = tf.keras.models.Model(X, Y) #: X,Y 레이어로 하나의 모델을 생성
model.compile(loss='mse') # 만들어진 모델은 반드시 컴파일 해야 한다.
데이터가 들어오는 입구인 Input 레이어와 나가는 출구인 Dense 레이어를 설정한다.매개변수는 데이터의 개수.
loss = 'mse' 모델에 대한 손실함수는 mse(평균 제곱 오차)를 사용
즉, 학습과정에서 틀린 정도(오차)를 계산할 때 Mean Squared Error 방식을 사용하겠다!
오차 정수가 0에 가까울 수록 알고리즘이 가중치 W를 미세하게 자동 조정한다!
"1개의 입력을 받아서 (Input(shape=[1])),
수학 연산을 거쳐 1개의 정답을 내보내는 (Dense(1)) 기계를 조립하고(Model),
오차를 줄여나갈 학습 전략을 세운다(compile)."
# 3. 데이터로 모델을 학습
print("\n모델 학습을 시작합니다...")
model.fit(independent, dependent, epochs=10)
fit -> 모델을 학습시키는 함수 epochs는 학습 횟수.
# 3. 데이터로 모델을 학습
print("\n모델 학습을 시작합니다...")
model.fit(independent, dependent, epochs=10)
#4 모델을 이용
print("\n---기존 데이터(independent) 예측 결과---")
print(model.predict(independent))
print("\n--- 내일 온도가 15도일 때의 판매량 예측 결과 ---")
predic_data = pd.DataFrame({'온도': [15]})
머신러닝 알고리즘
지도학습 영역에는 회귀문제와 분류 문제가 있다.
회귀 : 숫자로 된 결과를 예측 ( ex:레모네이드 판매량 예측)
분류 : 범주(category) 형태의 결과를 예측 (ex: 스팸메일 분류)
분류와 회귀 문제를 풀기 위해서 다양한 머신러닝 알고리즘이 쓰입니다.
1. 결정 트리(decision tree)
2. 랜덤 포레스트(random forest)
3. k-최근접 이웃(KKN: k-nearest neighbors)
4. 서포트 벡터 머신(SVM: support vector machine)
5. 인공 신경망(artificial neural networks)
#공통 데이터 준비
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier
#붓꽃 데이터 불러오기
X,y=load_iris(return_X_y=True)# 일반적으로 원인은 대문자 x, 결과는 소문자 y
'''
붓꽃 데이터 구조
문제지 (X: 4가지 특징)
꽃받침 길이 (Sepal Length), 꽃받침 너비(Sepal Width), 꽃잎 길이(Petal Length), 꽃잎 너비 (Petal Width)
정답지 (y: 3가지 품종)
세토사 (Setosa):0, 버시칼라(Versicolor):1, 버지니카(Virginica):2
'''
#데이터를 학습용(80%) 과 테스트용 (20%)으로 무작위 분할 # 꽃받침의 넓이, 줄기의 길이로 어떤 품종인지 알려줌
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
#
import time
# 모델의 학습 진행율을 보기 위한 라이브러리
from tqdm import tqdm
###1 결정 트리(Decision Tree)
from sklearn.tree import DecisionTreeClassifier
#결정 트리 모델 생성 및 학습
dt_model = DecisionTreeClassifier(random_state=42)
print("모델 학습을 시작합니다...")
# 기존의 range(100) 대신 tqdm(range(100))을 사용.
#desc 옵션을 주면 진행률 바 앞에 원하는 문구를 띄울 수 있다.
for epoch in tqdm(range(100), desc="[Epoch 학습 중]"):
#이 부분에 실제 모델 학습 코드(fit 등)가 들어간다.
dt_model.fit(X_train, y_train)
#진행률 확인을 위해 가상으로 0.05초씩 쉬어간다.
time.sleep(0.05)
print("학습이 완료되었습니다!")
# 테스트 데이터로 예측 및 정확도 확인
dt_pred = dt_model.predict(X_test)
print(f"결정 트리 정확도 : {accuracy_score(y_test, dt_pred):.2f}")
### 2 랜덤 포레스트
from sklearn.ensemble import RandomForestClassifier
# 랜덤 포레스트 모델 생성 ( 나무를 100개 만들도록 설정) 및 학습
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)#n_estimators: 의사 결정 트리를 몇개 만들건지
dt_model = DecisionTreeClassifier(random_state=42)
print("모델 학습을 시작합니다...")
for epoch in tqdm(range(100),desc="[Epoch 학습 중"):
rf_model.fit(X_train, y_train)
time.sleep(0.05)
print("모델 학습이 종료되었습니다...")
#예측 및 정확도 확인
rf_pred = rf_model.predict(X_test)
print(f"랜덤 포레스트 정확도 : {accuracy_score(y_test, rf_pred):.2f}")
### 3. k-최근접 이웃( KNN: k-nearest neighbors)
from sklearn.neighbors import KNeighborsClassifier
# KNN 모델 생성 ( 가장 가까운 이웃 3개를 참고하도록 설정) 및 학습
knn_model = KNeighborsClassifier(n_neighbors=3)
print("모델 학습을 시작합니다...")
for epoch in tqdm(range(100),desc="[Epoch 학습 중"):
knn_model.fit(X_train, y_train)
time.sleep(0.05)
print("모델 학습이 종료되었습니다...")
# 예측 및 정확도 확인
knn_pred = knn_model.predict(X_test)
print(f"KNN 정확도: {accuracy_score(y_test,knn_pred):.2f}")
###4. 서포트 벡터 머신(SVM: support vector machine)
from sklearn.svm import SVC
#SVM 모델 생성 (분류 기준을 직선으로 설정) 및 학습
svm_model = SVC(kernel='linear',random_state=42)
print("모델 학습을 시작합니다.")
for epoch in tqdm(range(100),desc="[Epoch 학습 중]"):
svm_model.fit(X_train, y_train)
time.sleep(0.05)
print("모델 학습이 종료되었습니다....")
# 예측 및 정확도 확인
svm_pred = svm_model.predict(X_test)
print(f"SVM 정확도: {accuracy_score(y_test,svm_pred):.2f}")
###5. 인공 신경망 (Artificial Neural Networks)
from sklearn.neural_network import MLPClassifier
#인공 신경망 모델 생성 (최대 1000번 반복 학습하도록 설정) 및 학습
ann_model= MLPClassifier(max_iter=1000,random_state=42)
print("모델 학습을 시작합니다...")
for epoch in tqdm(range(100),desc="[Epoch 학습 중]"):
ann_model.fit(X_train, y_train)
time.sleep(0.05)
print("모델 학습이 종료되었습니다....")
#예측 및 정확도 확인
ann_pred = ann_model.predict(X_test)
print(f"인공 신경망 정확도: {accuracy_score(y_test,ann_pred):.2f}")
사이킷런(Scikit-learn)
파이썬 환경에서 머신러닝을 구현할 때 사용하는 가장 표준적이고 강력한 라이브러리.
복잡한 수학 공식이나 알고리즘을 처음부터 짤 필요 없이, 결정 트리나 인공신경망 같은 다양한 모델들을 아주 짧은 코드로 불러와
사용할 수 있게 해주는 '머신러닝 종합 공구 상자'
머신러닝 워크플로우(Workflow of Machine Learning)
중앙의 트리 구조 (결정 트리 형태)를 중심으로, 머신러닝 프로젝트가진행되는 전체적인작업 흐름을 8단계로 나타낸 도해.
시계방향으로 진행되는 각 단계의 한국어 의미는 다음과 같다.

1. 전략 정의(De;fine Strategy)
어떤 문제를해결할 것인지, 머신러닝을 통해 달성하고자 하는 목표와 계획을 세우는 단계
2. 데이터 수집(Data Collection)
문제 해결에 필요한 다양한 데이터를 수집하고 모으는 단계
3. 데이터 전처리(Data Preprocessing)
문제 해결에 필요한 다양한 데이터를 수집하고 모으는 단계
4. 데이터 모델링(Data Modeling)
전처리된 데이터를 바탕으로, 문제 해결에 가장 적합한 머신러닝 알고리즘(모델)을 선택하고 설계하는 단계
5. 학습 및 평가(Training and Evalution)
선택한 모델에 데이터를 넣어 학습시키고, 그 모델이 얼마나 정확하게 작동하는지 시험해 보는(평가하는) 단계
6. 최적화(Optimization)
평가 결과를 바탕으로 모델의 성능을 최대한으로 끌어올리기 위해 미세하게 조정하고 개선하는 과정
7. 배포(Deplayment)
완성된 모델을 실제 서비스나 시스템에 적용하여 사용자들이 쓸 수 있게 만드는단계
8. 성능 모니터링(Performancd Monitoring)
배포된 모델이실제 환경에서도 에상대로 잘 작동하는지 지속적으로 관찰하고, 데이터 변화에 따른 성능 저하가없는지
확인하는 단계입니다. 이 결과에 따라 다시 전략을 수정하거나 데이터를 수집하는 등 순환하게 됩니다.
보스턴 집값 예측 실습
# 보스턴 집값 예측
import requests
# 라이브러리 사용
import tensorflow as tf
import pandas as pd
import certifi
from io import StringIO
#1. 과거의 데이터를 준비합니다.
path = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/boston.csv'
response = requests.get(path, verify=certifi.where())
boston = pd.read_csv(StringIO(response.text))
print(boston.columns)
boston.head()
라이브러리 import와 데이터 준비.
다음은 boston.csv의 칼럼과 데이터의 일부이다.

#독립변수, 종속변수 분리
independent= boston[['crim','zn','indus','chas','nox','rm','age','dis','rad','tax','ptratio','b','lstat']]
dependent = boston[['medv']]
boston에서 독립변수와 종속변수로 분리한다. 13개의 조건에 따른 집값 예측이므로
independent는 나머지 13개의 조건, dependent는 집값이다. 각각 506행 13열, 506행 1열이다.
#2. 모델의 구조
X=tf.keras.layers.Input(shape=[13]) # 독립변수(칼럼)
Y=tf.keras.layers.Dense(1)(X) # 종속변수
model = tf.keras.models.Model(X,Y)
model.compile(loss='mse')
독립변수와 종속변수로 Input 레이어와 Dense 레이어를 설정한다. 로스함수로 mse를 선택하고 컴파일 한다.
keras는 tensorflow 안에 있는 딥러닝 모델을 쉽고 직관적으로 만들 수 있게 해주는 파이썬 라이브러리임.
#3. 데이터로 모델을 학습
model.fit(independent,dependent,epochs=1000)
데이터들을 이용해서 모델을 1000번 학습시킨다.
#4. 모델을 이용
print(model.predict(independent[5:10]))
print(dependent[5:10])
print(model.get_weights())
출력 결과:
[[26.129301]
[20.883503]
[17.717175]
[ 9.075988]
[17.332752]]
medv
5 28.7
6 22.9
7 27.1
8 16.5
9 18.9
[array([[-0.08689677],
[ 0.07696634],
[-0.06071758],
[ 3.3436177 ],
[ 1.6904595 ],
[ 3.9580069 ],
[ 0.01542883],
[-0.9243423 ],
[ 0.14606974],
[-0.00957732],
[ 0.04639207],
[ 0.01565579],
[-0.58180475]], dtype=float32), array([2.4192894], dtype=float32)]
'''
# 원핫인코딩
=> 범주형 데이터(Categorical Data)를 수치 데이터로 변환하는 가장 기본적인 방법
과일 종류인 [사과, 바나나, 포도]를 원-핫 인코딩으로 변환
범주 사과 바나나 포도
사과 1 0 0
바나나0 1 0
포도 0 0 1
붓꽃 데이터
===========================================
선형 회귀(Linear Regression): 연속적인 실수
로지스틱 회귀(Logistic Regression): 0 과 1 사이의 확률 / 분류 (Classification)
무엇을 예측하는가(결과값의 형태):
집값 예측, 주식 가격 예측, 기온 예측 <= 선형 회귀
스팸 메일 분류, 질병 양성/음성 판정, 합격/불합격 예측 <=로지스틱 회귀
======================================
선형 회귀(Linear Regression): 데이터의 경향성을 가장 잘 설명하는 하나의 '직선'을 찾는 모델
독립 변수(x)와 종속 변수(y) 사이의 선형 관계를 모델링
y = wx + b
특징 : 예측값이 음의 무한대에서 양의 무한대까지
예시 : "평수가 30평이고 역세권인 아파트의 가격은 얼마일까?"를 예측 할 때 사용
결과값 : '5억원','7억 5천만 원'과 같이 연속된 수치
======================================
로지스틱 회귀(Logistic Regression) : 분류(Classification)문제에 주로 사용
선형회귀의 결과값을 0과 1 사이로 압축하여, 특정 사건이 발생할 '확률'로 변환
특징: 결과값이 항상 0과 1 사이의 확률
보통 기준값(예: 0.5)을 정해두고,
예측된 확률이 이보다 크면 클래스 1 (예: 스팸 맞음) 작으면 클래스 0 (예:스팸 아님)으로 분류
예시: "이 메일이 스팸 메일일 확률은 얼마일까?"를 예측할 때 사용
결과값이 '0.9'라면 90% 확률로 스팸 메일이라고 판단하여 스팸함으로 분류
======================================
다중 회귀 : 2개 이상의 독립변수를 종합하여 예측하는 모델.
y = w1x1 + w2x2 + w3x3 + wnxn + b(bias:편향)
단순 회귀: 2차원에서 하나의 직선 형태
다중 회귀: 3차원 공간에서 데이터를 잘 설명하는 하나의 평면
=====================================
'''
아이리스 품종 분류
#아이리스 품종 분류
#라이브러리 사용
import tensorflow as tf
import pandas as pd
import requests
import certifi
from io import StringIO
from boston import independent
#1. 과거의 데이터를 준비
path ='https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/iris.csv'
response = requests.get(path, verify=certifi.where())
iris = pd.read_csv(StringIO(response.text))
iris.head()
#원핫인코딩
encoding=pd.get_dummies(iris)
encoding.head()
#-----------------------------------------
#칼럼이름 출력
print(encoding.columns)
#-----------------------------------------
#독립 변수(입력 데이터)와 종속 변수(정답 데이터)분리
#꽃잎길이,꽃잎폭,꽃받침길이,꽃받침폭,품종
independent=encoding[['꽃잎길이','꽃잎폭','꽃받침길이','꽃받침폭']]
dependent=encoding[['품종_setosa','품종_versicolor','품종_virginica']]
#-----------------------------------------
#2. 모델의 구조
X=tf.keras.layers.Input(shape=[4])
Y=tf.keras.layers.Dense(3,activation="softmax")(X)
model = tf.keras.models.Model(X,Y)
model.compile(loss='categorical_crossentropy',metrics=['accuracy'])
#-----------------------------------------
#3. 데이터로 모델을 학습
model.fit(independent,dependent,epochs=100)
#-----------------------------------------
#4. 모델을 이용
print(model.predict(independent[:5]))
'''
'''
print(dependent[:5])
print(model.predict(independent[-5:]))
print(dependent[-5:])
#-----------------------------------------
print(model.get_weights())
최소자승법
마치 여러 개의 별들이 흩어져 있을 때, 그 별들의 대략적인 흐름을 가장 잘 보여주는 하나의 선을 긋는 것과 같다.
이 점들의 흐름을 가장 잘 나타내는 하나의 직선을 그리는것.
우리가 어떤 직선을 그렸을 때, 실제 점들은그 직선 위에 딱 놓이지 않고 약간씩 떨어져 있다.
이 떨어진 거리가 바로 오차.
최소자승법은 이 모든 점들의 오차를 제곱해서 더한 값을 가장 작게 만드는 직선을 찾는 방법.
흩어진 데이터들을 가장 잘 설명하는 대표적인 선을 찾아주는 아주 유용한 방법이다. 이 선을 이용하면 앞으로의 경향을 예측하거나 데이터들 사이의 관계를파악하는 데 도움을 받을 수 있다.
회귀 계수
우리가 어떤 원인(독립변수)이 결과(종속변수)에 얼마나 영향을 미치는지 알려주는 숫자.
ex) 공부시간과 시험점수의 관계
회귀 계수가 5라면? 공부 시간을 1시간 늘릴때마다 시험점수가 평균적으로 5점씩 올라간다는 의미.
회귀 계수가 0에 가깝다면 원인이 결과에 거의 영향을 미치지 않는다는 의미이다.
SSE(오차 제곱 합)
최소자승법으로 찾은 "가장 잘 맞는 선"이 실제 데이터들을 얼마나 잘 설명하는지를 알려주는 숫자. 마치 우리가 그린 선들이 실제 점들과 얼마나 떨어져 있는지, 그 떨어진 정도를 종합적으로 보여주는 지표.
Sum of Squares(제곱 합)
이 오차들을 그냥 더하면 양수 오차와 음수 오차가 서로 상쇄될 수 있다. 그래서 각 오차를 제곱해준다.
제곱하면 모든 오차가 양수가 되고, 큰 오차는 더 크게 벌주는 효과도 있다. 그리고 이 제곱된 모든 오차들을 다 더한 값이 바로 제곱 합이다.
제곱 합이 작다 -> 실제 데이터들과 우리가 그린 선이 별로 떨어져 있지 않다는 뜻.
제곱 합이 크다 -> 실제 데이터들과 우리가 그린 선이 많이 떨어져 있다는 뜻.
최소자승법은 이 SSE 값을 가장 작게 만드는 선을 찾는 방법이다.
SST = 분산 * N
경사하강법
현재 위치에서 가장 가파르게 내려가는 방향을 찾아서 조금씩 이동. 이 "가장 가파르게 내려가는 방향"이 바로 경사를 의미. 그리고 이 방향으로 하강하는 방법을 쓰는것.
현재 상태에서 결과가 가장 좋아지는 방향(가장 가파르게 내려가는 방향)을 찾는다. 그 방향으로 아주 조금씩 움직인다.
'파이썬' 카테고리의 다른 글
| 0714 ML/DL(2) (0) | 2026.07.14 |
|---|---|
| 0710 Numpy (0) | 2026.07.10 |
| 0709 파이썬 기초 문법 복습 (0) | 2026.07.09 |
| 0708 데이터 분석 및 시각화 (0) | 2026.07.09 |
| 0707 Pandas (0) | 2026.07.09 |