# 환경셋팅
import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier # knn 분류 모델
from sklearn.tree import DecisionTreeClassifier # tree 분류 모델
from sklearn.ensemble import RandomForestClassifier # rf 분류 모델
# pd.read_csv(경로)
red_wine = pd.read_csv('./data/winequality-red.csv', delimiter=';')
white_wine = pd.read_csv('./data/winequality-white.csv', delimiter=';')
red_wine.head() # 위에서 5개의 행만 출력
red_wine.tail() # 아래에서 5개의 행만 출력
white_wine.head()
red_wine.info()
white_wine.info()
데이터 전처리
# r - 0, w - 1
red_wine['Label'] = 0
red_wine.head()
# white 데이터 Label 컬럼에 1이라고 입력하여 생성하기
white_wine['Label'] = 1
white_wine.head(3)
white_wine.tail(3)
pd.merge() # 열방향으로 데이터 병합 설정되어 있음 axis=1
# pd.concat([레드,화이트])
# axis=0 행방향으로 병합(default)
# axis=1 열방향으로 병합(변경가능)
# ignore_index=True 기존 데이터의 인덱스 번호는 무시하고, 합친 후 인덱스 번호 0부터 다시 셋팅
wine = pd.concat([red_wine, white_wine], axis=0, ignore_index=True)
wine.info()
# db 인덱스 - 데이터 접근 쉽게하려구(중복 - 혼동)
# csv 파일로 저장하기
wine.to_csv('./data/wine.csv', index=False)
# 파이썬 기본 내장 함수?
# wine 자료형태가 pandas 제공되는 자료
# 판다스 자료에 대해서 저장할 때 사용 하는 함수 to_csv()
# index=False True로 설정하면 index 정보가 컬럼으로 저장됨
data = pd.read_csv('./data/wine.csv')
data.head()
print(data.shape) # 행, 열 크기 출력
(6497, 13)
데이터 분리
# pandas 인덱싱 기법
# iloc, loc 인덱서 -->
# data.loc[시작행:끝행,시작열:끝열] 눈에 보이는 인덱스(int) + 눈에 보이는 문자열 입력 가능
# data.iloc[시작행:끝행,시작열:끝열] 내부에 무조건 인덱스(int) 값만 입력
# 답: Lable
# 문제: Label 을 제외한 나머지 컬럼
X = data.iloc[:,:12] # Label 을 제외한 나머지 컬럼
y = data.iloc[:,12] # Lable
print(X.shape, y.shape)
(6497, 12) (6497,)
# train_test_split 활용해서 분리
# 0과1값을 무작위로 섞어야 학습 데이터에 다양하게 들어갈 수 있음
# 1. 랜덤하게 섞는 기능 2. 비율에 따라서 분리 >> train_test_split()
# 7:3 비율로 행 분리
# random_state 7로 고정 (랜덤하게 섞이는 규칙을 고정하고 가자)
# X- train,test / y- train,test
# X_train, X_test / y_train, y_test
from sklearn.model_selection import train_test_split # train, test 분리한다!
# 7:3
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.3, random_state=7)
# 크기확인
print('훈련문제:', X_train.shape)
print('훈련답:', y_train.shape)
print('테스트문제:', X_test.shape)
print('테스트답:', y_test.shape)
훈련문제: (4547, 12)
훈련답: (4547,)
테스트문제: (1950, 12)
테스트답: (1950,)
# 객체 생성
# 하이퍼 파라미터 기본값 사용
# from sklearn.neighbors import KNeighborsClassifier # knn 분류 모델
# from sklearn.tree import DecisionTreeClassifier # tree 분류 모델
# from sklearn.ensemble import RandomForestClassifier # rf 분류 모델
knn_model = KNeighborsClassifier()
tree_model = DecisionTreeClassifier()
rf_model = RandomForestClassifier() # 단일 tree 여러개 결합한 상황 >> n_estimators=100
knn_model.fit(X_train, y_train)
tree_model.fit(X_train, y_train)
rf_model.fit(X_train, y_train)

knn_pre = knn_model.predict(X_test)
tree_pre = tree_model.predict(X_test)
rf_pre = rf_model.predict(X_test)
print('knn_pre:', knn_pre[:20])
print('tree_pre:', tree_pre[:20])
print('rf_pre:', rf_pre[:20])
knn_pre: [0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1]
tree_pre: [0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1]
rf_pre: [0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1]
# 평가
# accuracy_score(y_test, pred)
# 모델 평가 기능
# score()
knn_model.score(X_test, y_test) # 0.9338461538461539
tree_model.score(X_test, y_test) # 0.9841025641025641
rf_model.score(X_test, y_test) # 0.9953846153846154
# 검증을 할 필요는 있음
# rf_model 또 다른 , 새로운 test 데이터를 만나도
# 99% 정도의 성능을 낼 것인가? == 일반화 모델인가?
# 교차검증 통해서 확인을 해볼 수도 있음