【机器学习⼊门】(1)K近邻算法:原理、实例应⽤(红酒分类预测)附python完整代码及数据集
各位同学好,今天我向⼤家介绍⼀下python机器学习中的K近邻算法。内容有:K近邻算法的原理解析;实战案例--红酒分类预测。红酒数据集、完整代码在⽂章最下⾯。
案例简介:有178个红酒样本,每⼀款红酒含有13项特征参数,如镁、脯氨酸含量,红酒根据这些特征参数被分成3类。要求是任意输⼊⼀组红酒的特征参数,模型需预测出该红酒属于哪⼀类。
1. K近邻算法介绍
1.1 算法原理
原理:如果⼀个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的⼤多数属于某⼀个类别,那么该样本也属于这个类别。简单来说就是,求两点之间的距离,看距离谁是最近的,以此来区分我们要预测的这个数据是属于哪个分类。
我们看图来理解⼀下。蓝⾊点是属于a类型的样本点,粉⾊点是属于b类型的样本点。此时新来了⼀个点(黄⾊点),怎么判断是属于它是a类型还是b类型呢。
⽅法是:新点距离⾃⾝最近的k个点(k可变)。分别计算新点到其他各个点的距离,按距离从⼩到⼤
排序,出距离⾃⾝最近的k个点。统计在这k个点中,有多少点属于a类,有多少点属于b类。在这k个点中,如果属于b类的点更多,那么这个新点也属于b分类。距离计算公式也是我们熟悉的勾股定理。
1.2 算法优缺点
算法优点:简单易理解、⽆需估计参数、⽆需训练。适⽤于⼏千-⼏万的数据量。
算法缺点:对测试样本计算时的计算量⼤,内存开销⼤,k值要不断地调整来达到最优效果。k值取太⼩容易受到异常点的影响,k值取太多产⽣过拟合,影响准确性。
2. 红酒数据集
2.1 数据集获取⽅式
红酒数据集是Scikit-learn库中⾃带的数据集,我们只需要直接调⽤它,然后打乱它的顺序来进⾏我们⾃⼰的分类预测。⾸先我们导⼊Scikit-learn库,如果⼤家使⽤的是anaconda的话,这个库中的数据集都是提前安装好了的,我们只需要调⽤它即可。
不到这个数据集的,我把红酒数据集连接放在⽂末了,有需要的⾃取。
Scikit-learn数据集获取⽅法:
(1)⽤于获取⼩规模数据集,数据集已在系统中安装好了的
sklearn.datasets.load_数据名()
from sklearn import datasets
#系统中已有的波⼠顿房价数据集
boston = datasets.load_boston()
(2)远程获取⼤规模数据集安装到本地,data_home默认是位置是/scikit_learn_data/
sklearn.datasets.fetch_数据名(data_home = 数据集下载⽬录)
# 20年的新闻数据下载到
datasets.fetch_20newsgroups(data_home = './newsgroups.csv') #指定⽂件位置
这两种⽅法返回的数据是 .Bunch类型,它有如下属性:
data:特征数据⼆维数组;相当于x变量
target:标签数组;相当于y变量
DESCR:数据描述
feature_names:特征名。新闻数据、⼿写数据、回归数据没有
target_name:标签名。回归数据没有
想知道还能获取哪些数据集的同学,可去下⾯这个⽹址查看具体操作:
2.2 获取红酒数据
⾸先导⼊sklearn的本地数据集库,变量wine获取红酒数据,由于wine接收的返回值是.Bunch类型的数据,因此我⽤win_data接收所有特征值数据,它是178⾏13列的数组,每⼀列代表⼀种特征。win_target⽤来接收所有的⽬标值,本数据集中的⽬标值为0、1、2三
类红酒。如果⼤家想更仔细的观察这个数据集,可以通过wine.DESCR来看这个数据集的具体描述。
然后把我们需要的数据转换成DataFrame类型的数据。为了使预测更具有⼀般性,我们把这个数据集打乱。操作如下:
from sklearn import datasets
wine = datasets.load_wine() # 获取葡萄酒数据
wine_data = wine.data #获取葡萄酒的索引data数据,178⾏13列
wine_target = wine.target #获取分类⽬标值
# 将数据转换成DataFrame类型
wine_data = pd.DataFrame(data = wine_data)
wine_target = pd.DataFrame(data = wine_target)
# 将wine_target插⼊到第⼀列,并给这⼀列的列索引取名为'class'
wine_data.insert(0,'class',wine_target)
# ==1== 变量.sample(frac=1) 表⽰洗牌,重新排序
# ==2== 变量.reset_index(drop=True) 使index从0开始排序
wine = wine_data.sample(frac=1).reset_index(drop=True) #把DataFrame的⾏顺序打乱
我们取出最后10⾏数据⽤作后续的验证预测结果是否正确,这10组数据分出特征值(相当于x)和⽬标值(相当于y)。剩下的数据也分出特征值features和⽬标值targets,⽤于模型训练。剩下的数据中还要划分出训练集和测试集,下⾯再详述。到此,数据处理这块完成。
#取后10⾏,⽤作最后的预测结果检验。并且让index从0开始,也可以不写.reset_index(drop=True) wine_predict = wine[-10:].reset_index(drop=True)
# 让特征值等于去除'class'后的数据
wine_predict_feature = wine_predict.drop('class',axis=1)
# 让⽬标值等于'class'这⼀列
wine_predict_target = wine_predict['class']
wine = wine[:-10] #去除后10⾏
features = wine.drop(columns=['class'],axis=1) #删除class这⼀列,产⽣返回值
targets = wine['class'] #class这⼀列就是⽬标值
3. 红酒分类预测
3.1 划分测试集和训练集
⼀般采⽤75%的数据⽤于训练,25%⽤于测试,因此在数据进⾏预测之前,先要对数据划分。划分⽅式:
使⽤ain_test_split 模块进⾏数据分割。
x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=数据占⽐)
train_test_split() 括号内的参数:
x:数据集特征值(features)
y:数据集⽬标值(targets)
test_size: 测试数据占⽐,⽤⼩数表⽰,如0.25表⽰,75%训练train,25%测试test。
train_test_split() 的返回值:
x_train:训练部分特征值
x_test: 测试部分特征值
y_train:训练部分⽬标值
y_test: 测试部分⽬标值
# 划分测试集和训练集
del_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(features,targets,test_size=0.25)
3.2 数据标准化
由于不同数据的单位不同,数据间的跨度较⼤,对结果影响较⼤,因此需要进⾏数据缩放,例如归⼀化和标准化。考虑到归⼀化的缺点:如果异常值较多,最⼤值和最⼩值间的差值较⼤,会造成很⼤影响。我采⽤数据标准化的⽅法,采⽤⽅差标准差,使标准化后的数据均值为0,标准差为1,使数据满
⾜标准正态分布。
# 先标准化再预测
python新手代码及作用from sklearn.preprocessing import StandardScaler #导⼊标准化缩放⽅法
scaler = StandardScaler() #变量scaler接收标准化⽅法
# 传⼊特征值进⾏标准化
# 对训练的特征值标准化
x_train = scaler.fit_transform(x_train)
# 对测试的特征值标准化
x_test = scaler.fit_transform(x_test)
# 对验证结果的特征值标准化
wine_predict_feature = scaler.fit_transform(wine_predict_feature)
3.3 K近邻预测分类
使⽤sklearn实现k近邻算法
ighbors import KNeighborsClassifier
KNeighborsClassifier(n_neighbors = 邻居数,algorithm = '计算最近邻居算法')
.fit(x_train,y_train)
KNeighborsClassifier() 括号内的参数:
n_neighbors:int类型,默认是5,可以⾃⼰更改。(出离⾃⾝最近的k个点)
algorithm:⽤于计算最近邻居的算法。有:'ball_tree'、'kd_tree'、'auto'。默认是'auto',根据传递给fit()⽅法的值来决定最合适的算法,⾃动选择前两个⽅法中的⼀个。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论