아이티윌_데이터 분석 55기/강의내용 필기_분석(Python)

#4 4일차_복사 / SVM·RF 실습 / 모델링 파이프 라인 구축 / 분류 모델 / knn

ecosso 2026. 6. 5. 17:54

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