python实现KNN模型分类预测并验证评估(附代码)

实现功能:

python实现KNN建模,选择最佳K值,对数据样本进行分类预测,并验证评估。

实现代码:

# 导入需要的库

from warnings import simplefilter

simplefilter(action='ignore', category=FutureWarning)

import pandas as pd

from sklearn.model_selection import train_test_split

import seaborn as sns

import matplotlib.pyplot as plt

from sklearn import metrics

from sklearn.metrics import roc_curve, auc

from sklearn.neighbors import KNeighborsClassifier

def Read_data(file):

    dt = pd.read_csv(file)

    dt.columns = ['age', 'sex', 'chest_pain_type', 'resting_blood_pressure', 'cholesterol',

                  'fasting_blood_sugar', 'rest_ecg', 'max_heart_rate_achieved','exercise_induced_angina',

                  'st_depression', 'st_slope', 'num_major_vessels', 'thalassemia', 'target']

    data =dt

    print(data.head())

    return data

    # ===================数据清洗======================

def data_clean(data):

    # 重复值处理

    print('存在' if any(data.duplicated()) else '不存在', '重复观测值')

    data.drop_duplicates()

    print('不存在' if any(data.isnull()) else '存在', '缺失值')

    data.dropna()  # 直接删除记录

    data.fillna(method='ffill')  # 前向填充

    data.fillna(method='bfill')  # 后向填充

    data.fillna(value=2)  # 值填充

    data.fillna(value={'resting_blood_pressure': data['resting_blood_pressure'].mean()})  # 统计值填充

    # 异常值处理

    data1 = data['resting_blood_pressure']

    # 标准差监测

    xmean = data1.mean()

    xstd = data1.std()

    print('存在' if any(data1 > xmean + 2 * xstd) else '不存在', '上限异常值')

    print('存在' if any(data1 < xmean - 2 * xstd) else '不存在', '下限异常值')

    # 箱线图监测

    q1 = data1.quantile(0.25)

    q3 = data1.quantile(0.75)

    up = q3 + 1.5 * (q3 - q1)

    dw = q1 - 1.5 * (q3 - q1)

    print('存在' if any(data1 > up) else '不存在', '上限异常值')

    print('存在' if any(data1 < dw) else '不存在', '下限异常值')

    data1[data1 > up] = data1[data1 < up].max()

    data1[data1 < dw] = data1[data1 > dw].min()

    return data

    #========================数据编码===========================

def data_encoding(data):

    data = data[["age", 'sex', "chest_pain_type", "resting_blood_pressure", "cholesterol",

                "fasting_blood_sugar", "rest_ecg","max_heart_rate_achieved", "exercise_induced_angina",

                "st_depression", "st_slope", "num_major_vessels","thalassemia","target"]]

    Discretefeature=['sex',"chest_pain_type", "fasting_blood_sugar", "rest_ecg",

          "exercise_induced_angina",  "st_slope", "thalassemia"]

    Continuousfeature=["age", "resting_blood_pressure", "cholesterol",

                      "max_heart_rate_achieved","st_depression","num_major_vessels"]

    df = pd.get_dummies(data,columns=Discretefeature)

    df[Continuousfeature]=(df[Continuousfeature]-df[Continuousfeature].mean())/(df[Continuousfeature].std())

    df["target"]=data[["target"]]

    return df

def data_partition(data):

    #======================数据集划分==========================

    # 1.4查看样本是否平衡

    print(data["target"].value_counts())

    # X提取变量特征;Y提取目标变量

    X = data.drop('target', axis=1)

    y = data['target']

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2,random_state=10)

    return X_train, y_train, X_test, y_test

def Draw_ROC(list1,list2):

    fpr_model,tpr_model,thresholds=roc_curve(list1,list2,pos_label=1)

    roc_auc_model=auc(fpr_model,tpr_model)

    font = {'family': 'Times New Roman',

            'size': 12,

            }

    sns.set(font_scale=1.2)

    plt.rc('font',family='Times New Roman')

    plt.plot(fpr_model,tpr_model,'blue',label='AUC = %0.2f'% roc_auc_model)

    plt.legend(loc='lower right',fontsize = 12)

    plt.plot([0,1],[0,1],'r--')

    plt.ylabel('True Positive Rate',fontsize = 14)

    plt.xlabel('Flase Positive Rate',fontsize = 14)

    plt.show()

    return

    # =========================================KNN====================================

def KNN(X_train, y_train, X_test, y_test):

    training_accuracy = []

    test_accuracy = []

    neighbors_settings = range(1, 15)

    for n_neighbors in neighbors_settings:

        knn = KNeighborsClassifier(n_neighbors=n_neighbors)

        knn.fit(X_train, y_train)

        training_accuracy.append(knn.score(X_train, y_train))

        test_accuracy.append(knn.score(X_test, y_test))

    plt.figure()

    plt.plot(neighbors_settings, training_accuracy, label="training accuracy")

    plt.plot(neighbors_settings, test_accuracy, label="test accuracy")

    plt.ylabel("Accuracy")

    plt.xlabel("n_neighbors")

    plt.legend()

    plt.show()

    knn = KNeighborsClassifier(n_neighbors=11)

    knn.fit(X_train, y_train)

    print("Accuracy of K-NN classifier on training set: {:.3f}".format(knn.score(X_train, y_train)))

    print("Accuracy of K-NN classifier on test set: {:.3f}".format(knn.score(X_test, y_test)))

    predict_target = knn.predict(X_test)

    predict_target_prob = knn.predict_proba(X_test)

    predict_target_prob_knn = predict_target_prob[:, 1]

    print('预测正确总数:')

    print(sum(predict_target == y_test))

    print('KNN测试集:')

    print(metrics.classification_report(y_test, predict_target))

    print(metrics.confusion_matrix(y_test, predict_target))

    print('KNN训练集:')

    predict_Target = knn.predict(X_train)

    print(metrics.classification_report(y_train, predict_Target))

    print(metrics.confusion_matrix(y_train, predict_Target))

    return y_test,predict_target_prob_knn

if __name__=="__main__":

    data1=Read_data("F:\数据杂坛\\0504\heartdisease\Heart-Disease-Data-Set-main\\UCI Heart Disease Dataset.csv")

    data1=data_clean(data1)

    data2=data_encoding(data1)

    X_train, y_train, X_test, y_test= data_partition(data2)

    y_test,predict_target_prob_knn=KNN(X_train, y_train, X_test, y_test)

    Draw_ROC(y_test,predict_target_prob_knn)

实现效果:

喜欢记得点赞,在看,收藏,

关注V订阅号:数据杂坛,获取完整代码和效果,将持续更新!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容