本文已参加「新人创造礼」活动,一同开启掘金创造之路

天下武功,唯快不破。今日就正式解说如何经过《sklearn小抄》武林秘籍,成为一代宗师调包侠。欲练此功,必先自宫;就算自宫,未必成功;若不自宫,也能成功。传说江湖(机器学习领域)有两大派别:一是学术派,该派资历高,家境好,多为名门世家(学历高,数学好),重基础(数学推导和理论知识);一是实践派,以找人商讨为主(实践为主),多在商讨中提高才能。《机器学习实战》系列为学术派,《sklearn调包侠》系列为实践派,该系列会简略解说原理,多引用于《机器学习实战》系列的算法解说(必要的内力),然后在实操中完成各机器学习算法。 tips:在本篇中会按小抄具体过一遍,之后就或许会随意一些。

KNN算法原理

计算测验样本与每个练习样本的间隔,取前k个间隔最小的练习样本,最后挑选这k个样本中呈现最多的分类,作为测验样本的分类。 如图所示,绿色的为测验样本,当k取3时,该样本就归于红色类;当k取5时,就归于蓝色类了。所以k值的挑选很大程度影响着该算法的成果,一般k的取值不大于20。

sklearn调包侠之KNN算法

实战——糖尿病猜测

数据导入

本数据可在kaggle中进行下载,读者能够去我的百度云链接进行下载。 (链接:pan.baidu.com/s/1gqaGuQ9k… 暗码:lxfx) 该数据为csv格式文件,咱们经过pandas读入:

import numpy as np
import pandas as pd
data = pd.read_csv('data/pima-indians-diabetes/diabetes.csv')
data.head()

sklearn调包侠之KNN算法

咱们简略看下各字段的意思:

  • Pregnancies:怀孕的次数
  • Glucose:血浆葡萄糖浓度
  • BloodPressure:舒张压
  • SkinThickness:肱三头肌皮肤皱皱厚度
  • Insulin: 胰岛素
  • BMI:身体质量指数
  • Dia….:糖尿病血统指数
  • Age:年龄
  • Outcone:是否糖尿病,1为是

咱们把数据划分为特征和label,前8列为特征,最后一列为label。

X = data.iloc[:, 0:8]
Y = data.iloc[:, 8]
切分数据集

在模型练习前,需要将数据集切分为练习集和测验集(73开或许其它),这儿挑选82开,运用sklearn中model_selection模块中的train_test_split办法。

from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=22)

这儿的test_size为测验集的比例,random_state为随机种子,这儿可设置恣意数字,确保下次运转相同能够挑选出对应的练习集和测验集。

数据预处理

这儿没有对数据进行预处理。

模型练习与评价

KNN算法运用sklearn.neighbors模块中的KNeighborsClassifier办法。常用的参数如下:

  • n_neighbors,整数,也就是k值。
  • weights,默许为‘uniform’;这个参数能够针对不同的街坊指定不同的权重,也就是说,越近能够权重越高,默许是相同的权重。‘distance’能够设置不同权重。

在sklearn.neighbors还有一个变种KNN算法,为RadiusNeighborsClassifier算法,能够运用一定半径的点来取代间隔最近的k个点。 接下来,咱们经过设置weight和RadiusNeighborsClassifier,对算法进行比较。

from sklearn.neighbors import KNeighborsClassifier,RadiusNeighborsClassifier
model1 = KNeighborsClassifier(n_neighbors=2)
model1.fit(X_train, Y_train)
score1 = model1.score(X_test, Y_test)
model2 = KNeighborsClassifier(n_neighbors=2, weights='distance')
model2.fit(X_train, Y_train)
score2 = model2.score(X_test, Y_test)
model3 = RadiusNeighborsClassifier(n_neighbors=2, radius=500.0)
model3.fit(X_train, Y_train)
score3 = model3.score(X_test, Y_test)
print(score1, score2, score3)
#result
#0.714285714286 0.701298701299 0.649350649351

能够看出默许状况的KNN算法成果最好。

穿插验证

经过上述成果能够看出:默许状况的KNN算法成果最好。这个判断精确么?答案是不精确,因为咱们只是随机分配了一次练习和测验样本,或许下次随机挑选练习和测验样本,成果就不相同了。这儿的办法为:穿插验证。咱们把数据集划分为10折,每次用9折练习,1折测验,就会有10次成果,求十次的均匀即可。当然,能够设置cv的值,挑选不同的折数。

from sklearn.model_selection import cross_val_score
result1 = cross_val_score(model1, X, Y, cv=10)
result2 = cross_val_score(model2, X, Y, cv=10)
result3 = cross_val_score(model3, X, Y, cv=10)
print(result1.mean(), result2.mean(), result3.mean())
# result
# 0.712235133288 0.67966507177 0.64976076555

能够看出,仍是默许状况的KNN算法成果最好。

模型调优

无模型调优。