import xlwt
import xlrd
import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.decomposition import PCA
from sklearn import metrics

#pre-treatment
#read
trainData = pd.read_csv("fashion-mnist_train.csv")
testData = pd.read_csv("fashion-mnist_test.csv")
trainTarget = np.array(trainData,dtype='int')
testTarget = np.array(testData,dtype='int')
#split label and data
trainLabel = trainTarget[:,0]
trainData = trainTarget[:,1:]
testLabel = testTarget[:,0]
testData = testTarget[:,1:]
#PCA reduce dimension
pca = PCA(n_components=48)
trainData = pca.fit_transform(trainData)
testData = pca.transform(testData)



#knn
knn = KNeighborsClassifier(n_neighbors = 8,weights='uniform',metric='minkowski',p=1)
knn.fit(trainData,trainLabel)
knn_predictRes = knn.predict(testData)
#decision_tree
decision_tree = DecisionTreeClassifier(max_depth=10,random_state=74,criterion="gini")
decision_tree.fit(trainData,trainLabel)
dt_predictRes = decision_tree.predict(testData)

#result
#confusion_matrix
knn_cm = metrics.confusion_matrix(testLabel,knn_predictRes)
dt_cm = metrics.confusion_matrix(testLabel,dt_predictRes)
#recall
knn_recall = metrics.recall_score(testLabel,knn_predictRes,average=None)
dt_recall = metrics.recall_score(testLabel,dt_predictRes,average=None)
#precision
knn_precision = metrics.precision_score(testLabel,knn_predictRes,average=None)
dt_precision = metrics.precision_score(testLabel,dt_predictRes,average=None)
#F1_score
knn_F1Score = metrics.f1_score(testLabel,knn_predictRes,average=None)
dt_F1Score = metrics.f1_score(testLabel,dt_predictRes,average=None)
#predict accuracy
knn_score = knn.score(X=testData,y=testLabel)
dt_score = decision_tree.score(X=testData,y=testLabel)

#output
print("knn confusion matrix:\n"+str(knn_cm))
print("knn recall:\n"+str(knn_recall))
print("knn precision:\n"+str(knn_precision))
print("knn F1Score:\n"+str(knn_F1Score))
print("knn score:"+str(knn_score)+"\n")

print("decision tree confusion matrix:\n"+str(dt_cm))
print("decision tree recall:\n"+str(dt_recall))
print("decision tree precision:\n"+str(dt_precision))
print("decision tree F1Score:\n"+str(dt_F1Score))
print("decision tree score:"+str(dt_score)+"\n")



'''
print("knn_recall")
for num1 in range(0,10):
    print(knn_recall[num1]);
print("knn_precision")
for num1 in range(0,10):
    print(knn_precision[num1]);
print("knn_F1")
for num1 in range(0,10):
    print(knn_F1Score[num1]);

print("dt_recall")
for num1 in range(0,10):
    print(dt_recall[num1]);
print("dt_precision")
for num1 in range(0,10):
    print(dt_precision[num1]);
print("dt_F1")
for num1 in range(0,10):
    print(dt_F1Score[num1]);
'''
'''
wb = xlwt.Workbook()
ws = wb.add_sheet('knn_cm')
for num1 in range(0,10):
    for num2 in range(0,10):
        ws.write(num1+1,num2+1,str(knn_cm[num1][num2]))
ws = wb.add_sheet('dt_cm')
for num1 in range(0,10):
    for num2 in range(0,10):
        ws.write(num1+1,num2+1,str(dt_cm[num1][num2]))
wb.save("test.xls")
'''
'''
for num in range(1,20):
   knn = KNeighborsClassifier(n_neighbors = num,weights='distance')
   knn.fit(trainData,trainLabel)
   knn_predictRes = knn.predict(testData)
   #print("knn_recall:");print(metrics.recall_score(testLabel,knn_predictRes,average=None));
   #print("knn_precision:");print(metrics.precision_score(testLabel,knn_predictRes,average=None));
   #print("knn_F1Score:");print(metrics.f1_score(testLabel,knn_predictRes,average=None));
   #print("knn_predict_accuracy:");print(knn.score(X=testData,y=testLabel));
   print(knn.score(X=testData, y=testLabel));
'''
'''
for num in range(3,60):
   decision_tree = DecisionTreeClassifier(max_depth=num, random_state=42,criterion="entropy")
   decision_tree.fit(trainData, trainLabel)
   dt_predictRes = decision_tree.predict(testData)
   print(decision_tree.score(X=testData, y=testLabel));
'''

