from tensorflow.keras.datasets import fashion_mnist
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier


def load_normal_data():
    (X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
    return X_train, y_train, X_test, y_test

def scale_x(X_train, X_test, value=255.0):
    return X_train.astype('float32') / value, X_test.astype('float32') / value

def flat(matrix):
    x, y, z = matrix.shape[0], matrix.shape[1], matrix.shape[2]
    return matrix.reshape(x, y * z)

def pre_processing_dataset():
    X_train, y_train, X_test, y_test = load_normal_data()
    X_train, X_test = scale_x(X_train, X_test)
    X_train = flat(X_train)
    X_test = flat(X_test)
    return X_train, y_train, X_test, y_test

knn = KNeighborsClassifier()
knn.fit(X_train,y_train)
y_pred = knn.predict(X_test)
print(knn.score(X_test, y_test))

cm=confusion_matrix(y_test,y_pred)
f,ax=plt.subplots(figsize=(8,8))
sns.heatmap(cm,annot=True,linewidths=0.5,linecolor="red",fmt=".0f",ax=ax)
plt.xlabel("predicted value")
plt.ylabel("real value")
plt.show()
print(classification_report(y_test,y_pred))

knn2 = KNeighborsClassifier()
param = {'n_neighbors':[i for i in range(1,10)]}
gc = GridSearchCV(knn2, param_grid=param, cv=2)
gc.fit(X_train, y_train)
print(gc.best_params_)
gc.score(X_test, y_test)

scores = gc.cv_results_['mean_test_score']
fig = plt.figure(1,(8,4))
ax = plt.subplot(111)
plt.sca(ax)
plt.plot(range(1,10),scores,linewidth=3)
plt.xlabel('n_neighbors')
plt.ylabel('accuracy')
plt.grid()
plt.show()

knn = KNeighborsClassifier(n_neighbors=4)
knn.fit(X_train,y_train)
y_pred = knn.predict(X_test)
print(knn.score(X_test,y_test))

cm=confusion_matrix(y_test,y_pred)
f,ax=plt.subplots(figsize=(8,8))
sns.heatmap(cm,annot=True,linewidths=0.5,linecolor="red",fmt=".0f",ax=ax)
plt.xlabel("predicted value")
plt.ylabel("real value")
plt.show()
print(classification_report(y_test,y_pred))

dt = DecisionTreeClassifier()
dt.fit(X_train,y_train)
dt.score(X_test,y_test)
y_pred1 = dt.predict(X_test)
print(classification_report(y_test,y_pred1))

dt2 = DecisionTreeClassifier()
tree_params = {'max_depth': [10, 20, 30],   #将这三个深度拿到模型中训练，找到分类情况最好的那一个
               'max_features': [30, 50, 64]}

gc2 = GridSearchCV(dt2, tree_params,    #tree ->模型名 tree_paramas+>训练的参数，n_jobs->并行数，这里-1代表和CPU统一
                         cv=5, n_jobs=-1, verbose=True)  #verbose=True  日志跟踪，cv->验证折数

gc2.fit(X_train, y_train)
print(gc2.best_params_)
gc2.score(X_test, y_test)

dt = DecisionTreeClassifier(max_depth = 10, max_features = 64)
dt.fit(X_train,y_train)
y_pred2 = dt.predict(X_test)
print(classification_report(y_test,y_pred2))


