#1. 데이터를 로드합니다.
#2. 데이터를 확인합니다.
#3. 결측치를 확인합니다.
#4. 이상치를 확인합니다.
#5. 문자형 데이터인지 숫자형 데이터인지 확인합니다.
#6. 데이터를 정규화 합니다.
#7. 훈련 데이터와 테스트 데이터로 분리합니다.
#8. 모델을 설정합니다.
#9. 모델을 훈련시킵니다.
#10. 훈련된 모델로 테스트 데이터를 예측합니다.
#11. 모델을 평가합니다.
#12. 모델의 성능을 높입니다.
# ▩ 코드 구현
#1. 데이터를 로드합니다.
import pandas as pd
wbcd = pd.read_csv("c:\\data\\wisc_bc_data.csv")
wbcd.head()
#2. 데이터를 확인합니다.
wbcd.info() # 컬럼 32개, 행 569개로 구성되어있고 diagnosis 만 문자고 나머지 숫자
wbcd.shape # (569, 32)
wbcd.describe() # R 에서의 summary() 함수와 같은 결과를 출력합니다.
#3. 결측치를 확인합니다.
wbcd.isnull().sum()
#4. 이상치를 확인합니다.
def outlier_value(x): # 이상치를 확인하는 함수
for i in x.columns[x.dtypes=='float64']: # 가져오는 컬럼이 숫자형 컬럼이면
Q1 = x[i].quantile(0.25) # 숫자형 컬럼데이터의 25%에 해당하는 지점을 찾습니다.
Q3 = x[i].quantile(0.75) # 숫자형 컬럼데이터의 75%에 해당하는 지점을 찾습니다.
IQR = Q3 - Q1 # 사분위수 범위값을 구합니다.
print ( i, x[i][ (x[i] > Q3 + IQR*5) | ( x[i] < Q1-IQR*5)].count() )
#IQR*5 로 해도되고 다른 숫자를 넣어도 됩니다. 아주 심한 이상치들을 걸러낼 수 있도록
#5대신에 다른 숫자들을 넣으면 됩니다.
outlier_value(wbcd)
# 결과해석: area_se 와 dimension_se 가 이상치가 많이 있는것을 확인했습니다.
# 나중에 혹시 기계학습후에 정확도가 낮다면 이 이상치를 제거하거나 평균값으로
# 치환한 후에 다시 학습 시킬 필요가 있습니다.
#5. 문자형 데이터인지 숫자형 데이터인지 확인합니다.
wbcd.info()
#6. 데이터를 정규화 합니다.
from sklearn.preprocessing import MinMaxScaler
wbcd2 = wbcd.iloc[ : , 2: ] # 환자번호(id) 와 정답컬럼(diagnosis) 를 제외합니다.
wbcd2.head()
scaler = MinMaxScaler() # scaler 객체를 생성
scaler.fit(wbcd2) # min/max 정규화 계산을 수행합니다.
wbcd2_scaled = scaler.transform(wbcd2) # 위에서 계산된 내용으로 데이터를 변환해서
# wbcd2_scaled 에 담습니다.
# 0~1 사이의 데이터로 변경되었는지 확인합니다.
wbcd2_df = pd.DataFrame(wbcd2_scaled)
wbcd2_df.describe()
#w정답 데이터를 numpy 형태로 구성합니다
y= wbcd['diagnosis'].to_numpy()
y
#7. 훈련 데이터와 테스트 데이터로 분리합니다.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(wbcd2_scaled,y, test_size=0.1, random_state=1)
#설명: x_train : 훈련 데이터, x_test : 테스트 데이터
# y_train : 훈련 데이터의 정답 y_test : 테스트 데이터의 정답
# random_state =1 은 어느자리에서든 동일한 정확도를 보이는 모델을 생성하겠다.,
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)
#8. 모델을 설정합니다.
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=5)
#9. 모델을 훈련시킵니다.
model.fit(x_train, y_train)
#10. 훈련된 모델로 테스트 데이터를 예측합니다.
result = model.predict(x_test)
result
#11. 모델을 평가합니다.
y_test == result
sum(y_test==result)/57*100
# from sklearn.metrics import accuracy_score
# accuracy = accuracy_score(y_test, result)
# accuracy
#12. 모델의 성능을 높입니다.
k=[]
jung=[]
for i in range(1,29,2):
model = KNeighborsClassifier(n_neighbors=i)
model.fit(x_train,y_train)
result = model.predict(x_test)
accuracy = accuracy_score(y_test, result)
print('k가',i,'개일때 정확도는', accuracy,'입니다.')
k.append(i)
jung.append(accuracy)
import pandas as pd
from matplotlib import font_manager, rc
font = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font)
k=pd.DataFrame(k)
jung=pd.DataFrame(jung)
r=pd.concat([k,jung], axis =1)
r.columns=['개수','정확도']
r1=r.reset_index()
r=r1[['정확도']].plot.line(color = 'red')
r.set_xticks(range(len(list(range(1,29,2)))))
r.set_xticklabels( tuple(list(range(1,29,2))) )
r.set_xlabel('개수')