01 얕은 복사 / 깊은 복사
02 SVM / RF 비교 실습
03 모델링 파이프 라인 구축
04 분류 모델
05 knn (K nearest neighbors)
01 얕은 복사 / 깊은 복사
import pandas as pd
df1 = pd.DataFrame({'A':[1,2], 'B':[10,20]})
df2 = df1 # 복사
df3 = df1.copy # 복사
df1.iloc[0,0] = 100 # 원본 수정 발생
df2 # 카피본도 수정 발생 (메모리 절감 시 사용)
df3 # 원본과 무관함 (수정 사항 반영x, 정말 원본이 변경되면 안될 때 사용)
df2
Out[7]:
A B
0 100 10
1 2 20
df3
Out[8]:
<bound method NDFrame.copy of A B
0 100 10
1 2 20>
id(df1) # 주소값
id(df2) # df1 주소와 같음 (사실 df2라는 이름으로 df1 객체 영역을 바라보고 있는 것)
id(df3) # df1 주소와 다름 (물리적으로 df1과 완전히 분리되는 영역을 가짐)
> 결론 ) RF에 비해 SVM 모델이 성능이 낮은 이유
1) 노이즈 변수 삽입 -> state, area code 제거 고려?
2) 인코딩 오류
SVM 모델은 라벨인코딩 시 성능저하 문제 가능성
원핫인코딩 고려?
state 컬럼 calss 수가 너무 많아 원핫인코딩으로 인한 차원의 저주 가능성 존재
state 제거? 선택?
02 통신사 고객의 이탈 여부 예측을 위한 모델 생성
03 모델링 파이프 라인 구축
스케일링 -> 모델학습 -> 그리드서치 흐름의 연결과정 정의
# ** 사용법
from sklearn.pipeline import Pipeline
Pipeline([('scaler', model_name), # 1 step
('svm', model_name)]) # 2 step
[ 예제 - iris data 스케일링 후 SVM 적용 ]
# 1. 데이터 로딩
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
# 2. 파이프라인 구축
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
pipe_model = Pipeline([('scaler', StandardScaler()),
('svm', SVC(C=1))])
# 3. 데이터 분리
from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(X, y, random_state=0)
# 4. 모델 학습 / 평가
pipe_model.fit(train_x, train_y)
pipe_model.score(train_x, train_y)
pipe_model.score(test_x, test_y)
# 5. 예측
import numpy as np
new_data = np.array([[0.1,0.3,0.2,0.5]])
pipe_model.predict(new_data)
[ 예제 - iris data 스케일링 후 SVM 적용 (그리드 서치) ]
# 1. 파이프라인 구축
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
pipe_model = Pipeline([('scaler', StandardScaler()),
('svm', SVC(C=1))])
# 2. 그리드 서치
params = {'svm__C' : [0.001,0.01,0.1,1,10,100,1000],
'svm__gamma' : [0.001,0.01,0.1,1,10,100,1000]}
from sklearn.model_selection import GridSearchCV
m_gs = GridSearchCV(pipe_model, params, scoring = 'accuracy', cv = 5, n_jobs = -1)
m_gs.fit(train_x, train_y)
m_gs.score(train_x, train_y)
04 분류 모델
Tree : DT, RF, GBT, ABT / XGB, lightGBM 등
SVM
knn
NB
LR
# 회귀 모델
선형회귀, 릿지, 라쏘
Tree : DT, RF, GBT, ABT / XGB, lightGBM 등
SVM
knn
NB
LR
전처리
====================
딥러닝
크롤링
텍스트마이닝
05 knn (K nearest neighbors)
- 게으른 학습
- 쉽고 해석하기 좋은 모델
- 스케일에 민감
- 이상치에 민감
- 변수의 선택이 중요
- 범주형 변수가 많을수록 하나의 거리 척도로 거리를 측정 -> 수치 + 범주 혼합형일 경우 정확한 거리 측정이 어려움
- 적어도 수치형 데이터들이 많이 포함된 데이터가 knn에 유리하다.
- 범주형 데이터가 많아지게 되면 인코딩 이슈가 발생하며, 라벨 인코딩 자체가 의미가 없어 원핫인코딩을 진행해야 한다.
- 원 핫 인코딩을 진행할 시 고차원이 되는 문제 역시 발생한다.
[ 예제 - iris 종분류 (knn) ]
# 1. 데이터 로딩
from sklearn.datasets import load_iris
iris = load_iris()
x,y = iris.data, iris.target
# 2. 데이터 분리
from sklearn.model_selection import train_test_split
train_x, test_x, train_y, test_y = train_test_split(X,y,random_state=0)
# 3. 모델링 / 평가
from sklearn.neighbors import KNeighborsClassifier
m_knn = KNeighborsClassifier()
m_knn.fit(train_x, train_y)
m_knn.score(train_x, train_y)
m_knn.score(test_x, test_y)
m_knn.score(train_x, train_y)
Out[154]: 0.9732142857142857
m_knn.score(test_x, test_y)
Out[155]: 0.9736842105263158
# 4. 스케일링 전/후 비교
from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import KNeighborsClassifier
m_sc = MinMaxScaler()
train_x_sc = m_sc.fit_transform(train_x)
test_x_sc = m_sc.transform(test_x)
m_knn = KNeighborsClassifier()
m_knn.fit(train_x_sc, train_y)
print(m_knn.score(train_x_sc, train_y)) # 0.9642
print(m_knn.score(test_x_sc, test_y)) # 0.9736
print(m_knn.score(train_x_sc, train_y)) # 0.9642
0.9642857142857143
print(m_knn.score(test_x_sc, test_y)) # 0.9736
0.9736842105263158
# 5. 변수 선택 전/후 비교(petal 선택)
m_knn = KNeighborsClassifier()
m_knn.fit(train_x_sc[:,2:], train_y)
print(m_knn.score(train_x_sc[:,2:], train_y)) # 0.9553
print(m_knn.score(test_x_sc[:,2:], test_y)) # 1.0
print(m_knn.score(train_x_sc[:,2:], train_y)) # 0.9553
0.9553571428571429
print(m_knn.score(test_x_sc[:,2:], test_y)) # 1.0
1.0
# 6. 매개변수 튜닝
score_tr = []; score_te=[]
for k in range(1,11) :
m_knn = KNeighborsClassifier(k)
m_knn.fit(train_x_sc[:,2:], train_y)
score_tr.append(m_knn.score(train_x_sc[:,2:], train_y))
score_te.append(m_knn.score(test_x_sc[:,2:], test_y))
import matplotlib.pyplot as plt
plt.plot(range(1,11), score_tr, label='train')
plt.plot(range(1,11), score_te, label='test')
plt.legend()
plt.xticks(range(1,11))

# 7. 최종모형 선택
m_knn = KNeighborsClassifier(3)
m_knn.fit(train_x_sc[:,2:], train_y)
print(m_knn.score(train_x_sc[:,2:], train_y)) # 0.9732
print(m_knn.score(test_x_sc[:,2:], test_y)) # 0.9736
print(m_knn.score(train_x_sc[:,2:], train_y)) # 0.9732
0.9732142857142857
print(m_knn.score(test_x_sc[:,2:], test_y)) # 0.9736
0.9736842105263158
'아이티윌_데이터 분석 55기 > 강의내용 필기_분석(Python)' 카테고리의 다른 글
| #6 교호작용 및 효과 검증 (0) | 2026.06.09 |
|---|---|
| #5 5일차_데이터 분석 과정, 로지스틱 회귀, 교호작용 (0) | 2026.06.08 |
| #3 3일차_SVL 실습, 독립변수 스케일링 + 연습문제 및 문제풀이 (0) | 2026.06.04 |
| #2 2일차_랜덤포레스트 (분류), SVM (Support Vector Machine) (0) | 2026.06.02 |
| #1 1일차_ 분석 프로세스, 머신러닝 기반 모델링 기법, 의사결정나무 (0) | 2026.06.01 |