文章代码基于 2018年3天快速入门python机器学习P21-P22 修改而来(讲课的小姐姐声音非常好听)
机器学习代码的实现过程
0.鸢尾花案例
该数据集来源于网络。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。
我这里记录一下课程中鸢尾花案例的一个代码实现过程,其中有关机器学习相关的知识点不是很详细,完整代码会放在最后
1.获取数据集
数据集来源
机器学习就是通过大量的数据经过算法训练建立一个模型,然后通过这个模型可以对这类数据进行一个预测。
也就是说要进行机器学习先要有数据,下面是一些可以获得数据集的网站:
- UCI
- sklearn
- 阿里天池
- kaggle
数据集获取
这里用的是sklearn的鸢尾花数据集,如果是本地的数据的话就要自己写方法引入一下。
依赖库安装顺序 numpy / scipy / matplotlib / scikit-learn
安装方式:
pip install numpy
from sklearn.datasets import load_iris
iris = load_iris()
print("数据集", iris.data)
print("目标集", iris.target)
这里通过打印我们可以看到数据集是一个二维数组,目标集是一个一维数组
其中数据集中的一个数组,对应目标中相同位置的数字 如:0
而目标集中的每种数字表示一类。
2.测试集的划分
为什么要划分测试集?
因为这个数据集只有这么多,所以我们要分出一部分用于后续验证建立的模型是否正确
其中x_train, x_test, y_train, y_test
分别为训练集
,测试集
,训练集类别
,测试集类别
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target)
3.标准化
让不同的属性之间无量纲化,比如说我们要给房子分类,房子的大小是120平米
,价格24 00 000元
这时我们去构建模型时两个数字之间的相差较大不利于模型建立,所以我们要将其标准化在一定的区间上。
训练集和测试集都要进行标准化,不过测试集不需要fit
过程
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
4.算法预估器
4.1 KNN算法预估器
KNN的全称是K Nearest Neighbors,意思是K个最近的邻居,从这个名字我们就能看出一些KNN算法的蛛丝马迹了。K个最近邻居,毫无疑问,K
的取值肯定是至关重要的。
- 这里第一步我们实例化了一个
KNeighborsClassifier
对象并且指定了K值为3 - 第二步我们传入了训练集
x_train
,和训练验证集y_train
对其进行训练以生成模型
estimator = KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train, y_train)
4.2 加入网格搜索与模型调优
上面说到K
的取值肯定是至关重要的
所以通过模型调优可以获得相对更好的K值,而不要用我们去给定
这里我给定K
的范围是在[1,3,5,7,9,11]
中
estimator = KNeighborsClassifier()
param_dict = {"n_neighbors":[1,3,5,7,9,11]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)
estimator.fit(x_train, y_train)
5.模型评估
模型建立后我们需要验证它的好坏,这里主要是两种方式
5.1 对比真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对", y_test == y_predict)
5.2 计算准确值
score = estimator.score(x_test, y_test)
print("准确率:", score)
6.模型成果保存
一般一个复杂的机器学习过程时间都是很长的,所以如何机器学习获得的模型达到了我们的预期,我们就需要将它保存起来,这样下一次就可以之间调用模型了
joblib.dump(estimator, "Achievements/flowers.pkl")
7.完整代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
import joblib
def knn_iris():
# knn算法
# 1.获取数据
iris = load_iris()
print("数据集", iris.data)
print("目标集", iris.target)
# 2.划分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target)
# 3.标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4.KNN 算法预估器
# estimator = KNeighborsClassifier(n_neighbors=3)
# estimator.fit(x_train, y_train)
# 4.KNN 算法预估器 加入网格搜索与模型调优
estimator = KNeighborsClassifier()
param_dict = {"n_neighbors":[1,3,5,7,9,11]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)
estimator.fit(x_train, y_train)
# 5.模型评估
# 5.1 对比真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对", y_test == y_predict)
# 5.2 计算准确值
score = estimator.score(x_test, y_test)
print("准确率:", score)
print("最佳参数:", estimator.best_params_)
print("最佳结果:", estimator.best_score_)
print("最佳估计器:", estimator.best_estimator_)
print("交叉验证结果:", estimator.cv_results_)
# 6. 成果保存
joblib.dump(estimator, "Achievements/flowers.pkl")
if __name__ == "__main__":
# 鸢尾花
knn_iris()