kNN파이썬 구현

허선우·2021년 6월 30일
0

인공지능/딥러닝

목록 보기
4/4
post-thumbnail
#1.데이터를 로드합니다. 
wbcd = pd.read_csv("c://data//wisc_bc_data.csv")
#2.데이터를 확인합니다. 
#판다스는 R과는 다르게 stringsAsFactors = True를 지정하지 않아도 됩니다. 
wbcd.info()
wbcd.shape  #몇 행 몇열인지 확인 (569, 32)
wbcd.describe()


#### 3.이상치와 결측치를 확인합니다. 

#이상치 확인

def outlier_value(x):
    for i in x.columns[x.dtypes=='float64']:
        Q1 = x[i].quantile(0.25)
        Q3 = x[i].quantile(0.75)
        IQR = Q3 - Q1
        print(i,x[i][(x[i]>Q3+IQR*5)|(x[i]<Q1-IQR*5)].count())

        
outlier_value(wbcd)

##혹시 나중에 결과값이 너무 안나오면 여기서 너무 큰 이상치값은 중앙값으로 치환하도록 한다. 

#결측치 확인
wbcd.isnull().sum()  
#결측치 없음


#4.명목형 데이터가 있는지 확인합니다. 
#diagnosis
#5.데이터를 정규화합니다. 
from sklearn.preprocessing import MinMaxScaler

wbcd2 = wbcd.iloc[:,2:]

scaler = MinMaxScaler()
scaler.fit(wbcd2)  #최대최소법으로 데이터를 계산합니다. 
df_scaled = scaler.transform(wbcd2)

wbcd3 = pd.DataFrame(df_scaled, columns = wbcd2.columns)
##환자번호와 정답을 제외한 전체 데이터 (dataframe)
wbcd3
#numpy형의 데이터 (정답, 나머지 비교 데이터 )
x = df_scaled
y = wbcd['diagnosis'].to_numpy()

#훈련데이터와 테스트데이터로 데이터를 분리합니다.
#훈련 9, 테스트 1
from sklearn.model_selection import train_test_split

#x_train 훈련데이터
#x_test 테스트데이터
#y_train훈련데이터의 정답
#y_test 테스트데이터의 정답

#random_state = 1 ->seed값 똑같이 하는거, 어느자리에서든 동일한 정확도를 보이는 모델을 만들기 위해서 
#size = 0.1 은 90,10퍼센트로 나타낸 것 
x_train, x_test,y_train,y_test = train_test_split(x,y,test_size = 0.1,random_state = 1)
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)

#모델을 설정합니다. 
from sklearn.neighbors import KNeighborsClassifier as KN
model = KN(n_neighbors = 5)
model.fit(x_train, y_train)

result = model.predict(x_test)

#모델을 평가합니다. 
sum(y_test == result)/57*100
from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test,result)  #(실제, 예측)
accuracy


##크로스 테이블 만들기 
from sklearn.metrics import confusion_matrix
tn,fp,fn,tp = confusion_matrix(y_test, result).ravel()
print(tn,fp,fn,tp)

#43 0 1 13
#FALSE NEGATIVE가 1이다 즉, 아니라했는데 맞는게 1명 있으니 이걸 0으로 만들어라. 


#문제 249. FN을 0으로 만들면서 정확도가 가장 좋은 k값은 무엇인가?
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix

knn_num  =[]
accu_num = []
fn_num =[]
for i in range(1,513,2):
    model = KN(n_neighbors = i)
    model.fit(x_train, y_train)
    result = model.predict(x_test)
    
    accuracy = accuracy_score(y_test,result)  #정확도(실제, 예측)
    tn,fp,fn,tp = confusion_matrix(y_test, result).ravel()#FN
    knn_num.append(i)
    accu_num.append(round(accuracy,2))
    fn_num.append(fn)

dt = pd.DataFrame({'knn':knn_num,'정확도':accu_num,'FN':fn_num})
min_fn = dt.FN.min()
정확도 = dt['정확도'][dt['FN']== dt.FN.min()].max()
knn = dt['knn'][(dt.정확도 == 정확도)&(dt.FN == dt.FN.min())].min()

print('가장 작은 fn값: ',min_fn, '\n정확도: ',정확도,'\n가장 작은 knn값: ',knn)

0개의 댓글