机器学习基础+实践(一):鸢尾花分类


一些概念

机器学习的前身

人为指定决策规则。人为指定决策规则适合处理人们非常熟悉处理过程的应用,一旦数据量过大、数据处理过程复杂或者任务有所变化,就需要机器学习上场了

机器学习

监督学习

用户将输入和预期输出提供给算法,算法根据给定输入给出预期输出。这里的"监督"就是样例的预期输出,这个输出“监督”着算法。监督学习算法需要提供大量数据

  • 识别信封上手写的邮政编码
  • 基于医学影像判断肿瘤是否为良性
  • 检测信用卡交易中的诈骗行为
无监督学习

只有输入数据已知,没预期的输出数据。理解和评估此类算法比较困难,例如

  • 分析一些列博客文章的主题
  • 将客户分类为具有相似偏好的群组
  • 检测网站的异常访问模式

机器学习中的每个实体或每一行称为样本or数据点,每一列或者描述实体的属性成为特征。

构建机器学习解决方案需要注意的点:

  • 我的问题是什么?已经收集到的数据能够回答这个问题了吗?
  • 我的问题如何表达成机器学习问题?
  • 我收集的问题是否足够表达我想解决的问题?
  • 提取了数据的哪些特征?这些特征是否能实现真正的预测?
  • 如果预测应用是否成功?
  • 这个解决方案与商业产品中的其他部分是如何影响的?

各项工具

(版本均未指定,默认最新)

scikit-learn:机器学习库,包含各种算法

NumPy:科学计算的基础包,包括各种数组,数学函数等,在机器学习中主要用到的是,将NumPy数组格式的数据传给算法

SciPy:科学计算的函数集合,包含线性代数高级程序、特殊函数函数和统计分布等。在这里主要用到scipy.sparse输出稀疏矩阵(大部分元素为0,非0元素分布无规律)

Matplotlib:科学绘图库,可生成数据的可视化内容

Pandas:处理和分析数据的库,基于DataFrame的数据结构,类似一个Excel表格,pandas中包含各种操作这个数据结构的API,还可以提取各种文件格式和数据库中的数据

mglearn:《Python机器学习基础教程》书本自带库,用于美化绘图


鸢尾花分类

数据来源:内置在sklearn的datasets中,由load_iris()函数获取

from sklearn.datasets import load_iris
datas=load_iris()

数据内容(主要)

data:样本数据,格式为Numpy数组。例如:[5.1 3.5 1.4 0.2],每行数据代表一朵花的测量数据

target:测量过的每朵花的品种,同样是一维Numpy数组。对应data中的每一行数据所测得的结果

target_names:想要预测的花的品种,target中的结果对应着这里的names。是一个字符串数组

feature_names:对每个特征进行说明,对应data中的各个属性。字符串数组

DESCR:数据集的简要说明,类似备注

规划数据:测试集

注意:不能用训练的数据来测试模型,因为模型会记住训练时用的数据集,所以会100%“预测”结果,这无法评估模型的泛化(预测)能力,应该使用测试数据集,确保这些数据集模型之前从未见过。一般的做法是将原有的数据集拿出25%作为测试用

train_test_split函数会将数据集打乱后,按照比例分割给X_train, X_test, y_train, y_test四个子集,X_train包含75%,X_test为25%,调用子集的shape()函数可看到数量

X_train, X_test, y_train, y_test = train_test_split(datas['data'], datas['target'], random_state=0)

检查数据:可视化

Ps:反正没怎么能看懂这些生成的图~在预测测试数据时应该是非必要的

将需要可视化的数据转成DataFrame
iris_dataframe=pd.DataFrame(X_train, columns=datas.feature_names)

grr = pd.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o',hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3)
#执行绘制
plt.show()

训练数据:基于训练构建模型

k近邻算法:在训练集中寻找与新数据点距离最近的数据点,将找到的数据点的标签赋值给新数据点,达到预测效果,k的含义指训练集与新数据点中最近的任意k个邻居,利用邻居中数量最多的类别做预测

#创建KNeighborsClassifier的实例,算法就封装在实例中,这里只需设置邻居为1即可
knn=KNeighborsClassifier(n_neighbors=1)
#构建基于训练的模型,fit函数返回的信息无需关注,它只修改了knn对象
knn.fit(X_train, y_train)

预测数据

将新的数据传入模型,模型会预测出结果

#将样本数据封装成numpy数组
X_new = np.array([[5,2.9,1,0.2]])

#封装好的数组传给knn的predict函数进行预测
prediction=knn.predict(X_new)

#查看预测结果和结果在target中对应的品种
print(prediction)
print(datas['target_names'][prediction])

评估模型

预测测试数据集,并和已知的品种进行对比,就可以计算出精度,从而衡量模型的优劣

#需要用到之前的测试集
y_pred=knn.predict(X_test)

#计算精度1
print('预测比例:{:.2f}'.format(np.mean(y_pred == y_test)))

#计算精度2
print('预测比例:{:.2f}'.format(knn.score(X_test, y_test)))

问题:数据分测试集这部分没有看懂