机器学习
一、概述
1、机器学习研究方向
- 传统预测
- 图像识别
- 自然语言处理
2、数据集构成
数据集 = 特征值+目标值
监督学习:
- 目标值为类别 属于分类问题
- 目标值为连续数据 属于回归问题
无监督学习
- 无目标值
3、机器学习流程
- 获取数据
- 数据处理
- 特征工程
- 机器学习模型-训练模型
- 模型评估
- 应用
4、书籍、框架
机器学习 | 深度学习 | |
---|---|---|
数集 | 西瓜书–周志华 | 花书 |
框架 | sklearn | theano、caffe2、chainer |
数据集 | sklearn、kaggle、UCI |
Kaggle网址:https://www.kaggle.com/datasets
UCI数据集网址: http://archive.ics.uci.edu/ml/
scikit-learn网址:[http://scikit-learn.org/stable/datasets/index.html#datasets]
二、特征工程
1、数据集
pip3 install Scikit-learn==0.19.1
from sklearn.datasets import load_**#小数据集
from sklearn.datasets import fetch_**#大数据集
1、小规模数据集
datasets.load_*()
#鸢尾花数据集
sklearn.datasets.load_iris()
#波士顿房价数据集
sklearn.datasets.load_boston()
2、大规模数据集
datasets.fetch_*(data_home=None,subset=“train”)
- data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
- subset:train表示只要测试集;all表示全部数据都要;test表示只要测试集
3、数据集的返回值
返回值类型:datasets.base.Bunch(继承自字典)
返回值属性:
- data:特征值
- target:标签
- descr:数据描述
- feature_names:特征名
- target_names:标签名
调用返回值方式:
bunch.key = value
dict[‘key’] = value
from sklearn.datasets import load_iris
def datasets_demo():
"""
sklearn数据集的使用
:return:
"""
# 获取数据集
iris = load_iris()
print("鸢尾花数据集: \n" ,iris)
print("查看数据集描述: \n",iris['DESCR'])
print("查看数据集特征值的名字: \n",iris.feature_names)
print("查看数据集标签的名字: \n",iris.target_names)
print("查看数据集特征值: \n",iris.data.shape , iris.data)# shape:(150, 4)
return None
if __name__ == "__main__":
# 代码1:sklearn数据集使用
datasets_demo()
4、数据集划分
from sklearn.model_selection import train_test_split
机器学习一般的数据集会划分为两个部分:
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
sklearn.model_selection.train_test_split(arrays, *options)
-
x 数据集的特征值
-
y 数据集的标签值
-
test_size 测试集的大小,一般为float
-
random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
-
return 测试集特征值、训练集特征值,训练标签(目标值),测试标签(目标值)
x_train , x_test , y_train , y_test
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def datasets_demo():
"""
sklearn数据集的使用
:return:
"""
# 获取数据集
iris = load_iris()
# print("鸢尾花数据集: \n" ,iris)
# print("查看数据集描述: \n",iris['DESCR'])
# print("查看数据.集特征值的名字: \n",iris.feature_names)
# print("查看数据集数据: \n",iris.data.shape , iris.data)# shape:(150, 4)
# 数据集的划分
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22 )
print("训练集的特征值: \n",x_train,x_train.shape)
return None
if __name__ == "__main__":
# 代码1:sklearn数据集使用
datasets_demo()
2、特征工程
什么是特征工程?
专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。(使用pandas、numpy对特征进行些处理)
特征工程内容分为三类:特征抽取、特征预处理、特征降维
1、特征抽取/特征提取
1)字典特征提取(特征离散化)
from sklearn.feature_extraction import DictVectorizer
属性
- DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵(稀疏矩阵)
- DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
- DictVectorizer.get_feature_names() 返回类别名称
使用场景
- 数据类型是字典
- 数据集中存在类别特征比较多(性别、等级),先将数据集的特征转化为字典类型,然后使用DictVerctorizer进行转换
代码
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
"""
字典特征抽取
:return:
"""
data = [{
'city': '北京', 'temperature': 100}
, {
'city': '上海', 'temperature': 60}
, {
'city': '深圳', 'temperature': 30}]
# 1、实例化转换器
transfer = DictVectorizer(sparse=False)
# 2、调用fit_transform
data_new = transfer.fit_transform(data,y=None)
print("打印返回结果: \n",data_new)
if __name__ == "__main__":
dict_demo()
sparse = False
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3YarFVus-1637326542934)(https://i.loli.net/2021/11/06/fuSsliOqzFD9UVb.png)]
sparse=Ture,只表示不是0的东西,可节约内存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHZcLEEz-1637326542936)(https://i.loli.net/2021/11/06/VOrXlQ3s8RjC9tG.png)]
注意:数据提取类似之前pandas中的one-hot编码
2)、文本特征提取
sklearn.feature_extraction.text import CountVectorizer
1、实例化
trans = CountVectorizer(stop_words)
stop_words表示停用词,即使样本中出现但是依旧不计数的词,通常有一个停用词表。
2、方法
-
CountVectorizer.fit_transform(X)
X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
统计每个样本中特征值出现的次数
-
CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵 返回值:转换之前数据格
-
CountVectorizer.get_feature_names() 返回值:单词列表
3、流程
- 实例化类CountVectorize
- 调用fit_transform方法输入数据并转换,注意返回格式,利用toarray()进行sparse矩阵转换array数组
sklearn.feature_extraction.text import CountVectorizer
def text_count_demo():
"""
对文本进行特征抽取,countvetorizer
:return:
"""
data = ["life is short,i like like python"
, "life is too long,i dislike python"]
# 1 实例化转换器类
transfer = CountVectorizer(stop_words=['is','like'])#stop_words:停用词
# 2 调用转换器中的方法
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new.toarray())
print("array数组:\n",transfer.inverse_transform(data_new))
print("特征名字:\n",transfer.get_feature_names())
if __name__ == "__main__":
text_count_demo()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PGkO5UzW-1637326542937)(https://i.loli.net/2021/11/07/tysLV4nuAQFwo5j.png)]
注意:此方法不支持中文,因为中文中没有空格,除非先分词
4、jieba中文分词
pip3 install jieba
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def china_text_count_demo():
"""
对中文文本进行特征抽取,countvetorizer
:return:
"""
data = ["我爱北京天安门"
, "天安门上太阳升"]
# 1 实例化转换器类
transfer = CountVectorizer()
# 2 调用转换器中的方法
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new.toarray())
print("array数组:\n",transfer.inverse_transform(data_new))
print("特征名字:\n",transfer.get_feature_names())
def cut_word(text):
"""
进行中文分词“我爱北京天安门 --> 我 爱 北京 天安门”
:return:
"""
a = " ".join(list((jieba.cut(text))))
print(a)
return text
def china_text_count_demo_2():
"""
中文文本特征值化,自动分词
:return:
"""
# 1 将中文文本进行分词
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,"
"但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,"
"这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。"
"了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
# print(data_new)
# 2 实例化countvetorizer
transf = CountVectorizer()
# 3 调用fit_transform()
data_final = transf.fit_transform(data)
print("data_final: \n",data_final)
print("特征提取结果:\n",data_final.toarray())
print("特征名字:\n",transf.get_feature_names())
return None
if __name__ == "__main__":
# 代码5 中文文本特征值提取,自动分词
china_text_count_demo_2()
# 代码6 中文分词
# cut_word("我爱北京天安门")
5、Tf-idf 提取特殊高频词(关键词)
from sklearn.feature_extraction.text import TfidfVectorizer
- 如果某个词或者短语在一篇文章中出现频率很高但是在其他文章中出现很少,那么这个词可以视为关键字
- Tf-idf用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
定义
- 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
- 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def tfidf_demo():
"""
tfidf进行文章特征提取
:return:
"""
# 1 将中文文本进行分词
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,"
"但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,"
"这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。"
"了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
# print(data_new)
# 2 实例化countvetorizer
transf = TfidfVectorizer(stop_words=["如果",'了解'])
# 3 调用fit_transform()
data_final = transf.fit_transform(data)
print("data_final: \n",data_final)
print("特征提取结果:\n",data_final.toarray())
print("特征名字:\n",transf.get_feature_names())
return None
if __name__ == "__main__":
# 代码7 TFidf进行文本特征提取
tfidf_demo()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrNevjhA-1637326542939)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20211107113347671.png)]
3)图象特征提取(深度学习)
详情见笔记:深度学习
3、特征预处理
1、预处理
1)预处理包含内容
- 归一化
- 标准化
2)包
sklearn.preprocessing
3)意义
征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
2、归一化
定义
通过对原始数据进行变换把数据映射到(默认为[0,1])之间
min-max归一化公式:
from sklearn.preprocessing import MinMaxScaler
X ′ = x − m i n m a x − m i n X' = \frac{x-min}{max-min} X′=max−minx−min
X ′ ′ = X ′ ∗ ( m x = m i ) + m i X''=X' * (mx = mi)+ mi X′′=X′∗(mx=mi)+mi
- 此方法可以将原始数据映射到【0-1】之间
- mx,mi分别为指定区间值默认mx为1,mi为0
- max min表示此列中最大最小值
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
def minmax_demo():
"""
minmax_归一化
:return:
"""
# 1 获取数据
data = pd.read_table("datingTestSet2.txt")#read_csvz中会把\t都读出来
print("data:\n",data)
# 2 实例化minmaxscaler()
transf = MinMaxScaler(feature_range=[2,3])
# feature_range 表示想要把数据处理成多少区间之间的,默认0-1
# 3 调用fit_transform
data_new = transf.fit_transform(data)
print((data_new))
return None
if __name__ == "__main__":
# 代码8 minmax归一化
minmax_demo()
3、标准化
from sklearn.preprocessing import StandardScaler
意义
归一化比较容易收到最大值最小值的影响,如果出现异常值,对结果影响较大,俗称鲁棒性较差,故提出标准化,即使出现异常值,也不会影响较大。
公式
X ′ = x − m e a n σ X' =\frac{x-mean}{\sigma} X′=σx−mean
作用于每一列,mean为平均值,σ为标准差
代码
from sklearn.preprocessing import StandardScaler
def standarScaler_demo():
"""
数据标准化
:return:
"""
# 1 数据导入
data = pd.read_table("datingTestSet2.txt")
# 2 实例化standscaler
transf = StandardScaler()
# 3 fit_transform()
data_new = transf.fit_transform(data)
print("data:\n ",data_new)
if __name__ == "__main__":
# 代码9 数据标准化
standarScaler_demo()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NmMHR2Ib-1637326542944)(https://i.loli.net/2021/11/07/B83tjmgeQApnbF5.png)]
4、特征降维
**降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程。(相关特征:两个有关系的特征,例如湿度与降雨量)
1、降维方式一–特征选择
(1)定义
数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。
(2)方法
- Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
- 方差选择法:低方差特征过滤
- 相关系数:特征与特征之间的相关程度
- Embedded (嵌入式):算法自动选择特征(特征与目标值之间的关联)
- 决策树:信息熵、信息增益
- 正则化:L1、L2
- 深度学习:卷积等
(3)模块
from sklearn.feature_selection import VarianceThreshold
2、征选择方式一 过滤式
删除低方差的一些特征,前面讲过方差的意义。再结合方差的大小来考虑这个方式的角度。
- 特征方差小:某个特征大多样本的值比较相近
- 特征方差大:某个特征很多样本的值都有差别
API
- sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
- 删除所有低方差特征
- Variance.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
from sklearn.feature_selection import VarianceThreshold
def variance_demo():
"""
过滤式处理低方差
:return:
"""
# 1 导入数据集
data = pd.read_csv("factor_returns.csv")
# 2 实例化VarianceThreshold转换器
transfer = VarianceThreshold(threshold=11)
#threshold表示设置的阈值,我们可以把小于这个阈值的删除,即为删除相关性比较强的内容
# 3 调用 fit_transform
data_new = transfer.fit_transform(data.iloc[:,1:-2])
print("data\n",data_new)
print("形状\n",data_new.shape)
print("原来形状\n",data.shape)
return None
if __name__ == "__main__":
# 代码10 低方差过滤
variance_demo()
data
[[ 5.95720000e+00 8.52525509e+10 8.00800000e-01 ... 1.21144486e+12
2.07014010e+10 1.08825400e+10]
[ 7.02890000e+00 8.41133582e+10 1.64630000e+00 ... 3.00252062e+11
2.93083692e+10 2.37834769e+10]
[-2.62746100e+02 5.17045520e+08 -5.67800000e-01 ... 7.70517753e+08
1.16798290e+07 1.20300800e+07]
...
[ 3.95523000e+01 1.70243430e+10 3.34400000e+00 ... 2.42081699e+10
1.78908166e+10 1.74929478e+10]
[ 5.25408000e+01 3.28790988e+10 2.74440000e+00 ... 3.88380258e+10
6.46539204e+09 6.00900728e+09]
[ 1.42203000e+01 5.91108572e+10 2.03830000e+00 ... 2.02066110e+11
4.50987171e+10 4.13284212e+10]]
形状
(2318, 7)
原来形状
(2318, 12)
3、皮尔逊相关系数(Pearson Correlation Coefficient)
反映变量之间相关关系密切程度的统计指标
相关系数的值介于–1与+1之间,即–1≤ r ≤+1。其性质如下
- 当r>0时,表示两变量正相关,r<0时,两变量为负相关
- 当|r|=1时,表示两变量为完全相关,当r=0时,表示两变量间无相关关系
- 当0<|r|<1时,表示两变量存在一定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱
- 一般可按三级划分:|r|<0.4为低度相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关
API
from scipy.stats import pearsonr
from scipy.stats import pearsonr
import matplotlib.pyplot as plt
def pearsonr_demo():
"""
相关系数计算
:return: None
"""
data = pd.read_csv("factor_returns.csv")
factor = ['pe_ratio', 'pb_ratio', 'market_cap', 'return_on_asset_net_profit', 'du_return_on_equity', 'ev',
'earnings_per_share', 'revenue', 'total_expense']
for i in range(len(factor)):
for j in range(i, len(factor) - 1):
print(
"指标%s与指标%s之间的相关性大小为%f" % (factor[i], factor[j + 1], pearsonr(data[factor[i]], data[factor[j + 1]])[0]))
plt.figure(figsize=(20, 8), dpi=100)
plt.scatter(data['revenue'], data['total_expense'])
plt.show()
return None
if __name__ == "__main__":
# 代码11 计算皮尔逊相关系数
pearsonr_demo()
指标pe_ratio与指标pb_ratio之间的相关性大小为-0.004389
指标pe_ratio与指标market_cap之间的相关性大小为-0.068861
指标pe_ratio与指标return_on_asset_net_profit之间的相关性大小为-0.066009
指标pe_ratio与指标du_return_on_equity之间的相关性大小为-0.082364
指标pe_ratio与指标ev之间的相关性大小为-0.046159
指标pe_ratio与指标earnings_per_share之间的相关性大小为-0.072082
指标pe_ratio与指标revenue之间的相关性大小为-0.058693
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KDoPiIxN-1637326542945)(https://i.loli.net/2021/11/07/lTZ67OE9t1pka4u.png)]
5、主成分分析
1、介绍
- 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
- 作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
- 应用:回归分析或者聚类分析当中
2、apl
from sklearn.decomposition import PCA
sklearn.decomposition.PCA(n_components=None)
- n_components:
- 小数:表示保留百分之多少的信息
- 整数:减少到多少特征
- PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后指定维度的array
from sklearn.decomposition import PCA
def PCA_demo():
"""
主成分分析降维
:return:
"""
# 1 导入数据
data = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
# 2 实例化
transfer = PCA(n_components=0.5)
# 3 调用fit_funcition函数
data_new = transfer.fit_transform(data)
print("data_new\n",data_new)
return None
if __name__ == "__main__":
# 代码12 PCA降维
PCA_demo()
保留90%的信息,降维结果为:
[[ -3.13587302e-16 3.82970843e+00]
[ -5.74456265e+00 -1.91485422e+00]
[ 5.74456265e+00 -1.91485422e+00]]
降维到3维的结果:
[[ -3.13587302e-16 3.82970843e+00 4.59544715e-16]
[ -5.74456265e+00 -1.91485422e+00 4.59544715e-16]
[ 5.74456265e+00 -1.91485422e+00 4.59544715e-16]]
三、分类算法
1、sklearn转换去和估计器
1、转换器
特征工程父类,所有的特征工程都会调用这个
- 实例化(Transformer)
- 调用fit_transform()方法
2、估计器(estimaor)
sklearn机器学习算法的实现
-
实例化一个estimateor
-
生成模型
estimator.fit(x_train,y_train)
- 评估模型好坏
-
法一、直接对比真实值与预测值
y_predict = estimato.predict(x_test)
t_test == y_predict
-
法二、计算准确率
accuracy = estimator.score(x_test,y_test)
-
2、KNN算法)(K近邻算法)
1、原理:根据邻居推算类别
分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。k 值的选择,距离度量和分类决策规则是 k 近邻算法的三个基本要素
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y1xPCPa0-1637326542946)(https://i.loli.net/2021/11/09/YebpDgyFwc7QzVW.png)]
2、距离度量
特征空间中两个实例点的距离时两个实例点相似程度的反映.
- 闵可夫斯基距离
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVzT7f93-1637326542948)(https://i.loli.net/2021/11/09/YDIk3cf1psqnUyG.png)]
-
欧氏距离:p=2
-
曼哈顿距离:p=1
- p=无穷:表示距离坐标最大值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-muxYwXx8-1637326542951)(https://i.loli.net/2021/11/09/8XT2ZRKJHwUFb9r.png)]
3、k值的选择
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于哪个类,就把该输入实例分为那个类
如果选择较小的 k 值,就相当于用较小的领域中的训练实例进行预测,只有与输入实例较近的的训练实例才会对预测结果起作用。但缺点是预测结果会对近邻的实例点非常敏感。这意味着整体模型变得更复杂,容易发生过拟合.
相反如果选择较大的 k 值,就相当于用较大领域中的训练实例进行预测. 这时与输入实例较远的训练实例也会对预测起作用,使预测发生错误。k 值的增大就意味着整体的模型变得简单。如果 k=N, 那么无论输入实例是什么,都将简单地预测它属于在训练实例中最多的类。这时,模型过于简单,完全忽略训练实例中的大量有用信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WAwQxWov-1637326542952)(https://i.loli.net/2021/11/09/OsIyqMTzC14nwxK.png)]
放入一个待分类的实例
• k = 1,按照某种距离度量找到最邻近的1个
训练样本测试实例的类别,判定为类1
• k = 3,按照某种距离度量找到最邻近的3个
训练样本测试实例的类别,判定为类2
• k = 5,按照某种距离度量找到最邻近的5个
训练样本测试实例的类别,判定为类1
4、KNN三要素
- K值选择
- 距离度量
- 分类决策规则(常采用投票规则)
5、APL
-
#第1步:从sklearn中导入模型 from sklearn.neighbors import KNeighborsClassifier sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto') #第2步:创建模型的实例 knn=KNeighborsClassifier(n_neighbors=k,algorithm='auto') # n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数,k值。 #algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率) #p 计算距离的方式p=2表示欧氏距离 #第3步:模型训练 knn.fit(X_train,y_train) #第4步:预测待分类数据的类别标签 y_pred=knn.predict(X_test)
#第1步:从sklearn中导入模型 from sklearn.neighbors import KNeighborsRegressor # 第2步:创建模型的实例 knn = KNeighborsRegressor(n_neighbors=2 #第3步:模型训练 knn.fit(X_train,y_train) # 第4步:预测待分类数据的类别标签 y_pred=knn.predict(X_test)
6、案例一:鸢尾花
from sklearn.neighbors import KNeighborsClassifier#KNN算法
from sklearn.model_selection import train_test_split#数据划分
from sklearn.datasets import load_iris#鸢尾花数据集
from sklearn.preprocessing import StandardScaler#标准化
# 鸢尾花种类分类
def knn_iris():
"""
用KNN对鸢尾花种类分类
:return:
"""
# (1) 获取数据
iris = load_iris()
# (2)划分数据集
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=6)
# (3)特征工程:标准化
transfer = StandardScaler()
x_train= transfer.fit_transform(x_train)#训练集要标准化
x_test = transfer.fit_transform(x_test)#测试集也要标准化
# (4)KNN 算法预估器
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(x_train,y_train)
# (5)模型评估
# 法一:直接比对真实值和预测值
y_predict = knn.predict(x_test)
print("y_predice:\n",y_predict)
print("直接对比真实值和预测值:\n",y_test==y_predict)
# 法二:计算准确率
score = knn.score(x_test,y_test)
print("准确率为:\n",score)
return None
if __name__ == "__main__":
# 代码1 用KNN对鸢尾花尽心种类预测
knn_iris()
7、案例二、预测签到位置