
机器学习第一课一、机器学习概述1.1机器学习的常用术语1.2算法分类①监督学习有监督 有标签有特征(1)连续回归(2)不连续分类②无监督学习无监督 有特征无标签③强化学习强化学习寻找最短路径最优解以便获得更多的奖励④半监督学习总结1.3机器学习的建模过程①获取数据②数据基本处理③特征工程④模型训练⑤模型评估1.4特征工程①特征提取会改变原数据②特征预处理方式一归一化处理方式当前值-最小值/最大值-最小值③特征降维④特征选择不会改变原数据⑤特征组合把多个特诊合并为一个特征1.5模型拟合问题拟合用在机器学习领域用来表示模型对样本点的拟合情况拟合模型在训练集和测试集上的表现情况欠拟合模型在训练集和测试集上表现都不好产生的原因模型过于简单过拟合模型在训练集上表现好测试集上表现不好产生原因模型过于复杂数据不纯训练数据太少泛化模型在新数据集非训练数据上的表现好坏的能力二、KNN算法k-近邻算法**算法思想**如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别则该样本也属于这个类别**样本的相似性**样本都属于一个任务数据集的。样本距离越近越相似欧式距离对应维度差值平方和开平方根2.1k值的选择2.2KNN算法解决的问题KNN算法主要解决的问题分为两类回归问题、分类问题这两类问题都有一个相同点①解决分类问题的流程②解决回归问题的流程2.3KNN算法API基于欧式距离或者其它距离计算方式计算测试集和每个训练集之间的距离然后根据距离升序排列找到最近的K个样本。基于K个样本投票票数多的就作为最终预测结果 → 分类问题。基于K个样本计算平均值作为最终预测结果 → 回归问题。实现思路分类问题适用于有标签、有特征、标签不连续回归问题适用于有标签、有特征、标签连续分类问题步骤1. 计算测试集和训练集之间的距离2. 对距离进行升序排序3. 选择最近的K个样本4. 根据K个样本的标签进行投票5. 返回票数最多的标签作为最终预测结果回归问题步骤1. 计算测试集和训练集之间的距离2. 对距离进行升序排序3. 选择最近的K个样本4. 根据K个样本的标签进行平均值计算5. 返回平均值作为最终预测结果①KNN算法分类问题的API# 1.导包fromsklearn.neighborsimportKNeighborsClassifier# 2.准备数据集x_train[[0],[1],[2],[3]]#训练集的特诊数据特征可以是多个所以是二维数组y_train[0,0,1,1]#训练集的标签是离散的所以是一维数组x_test[[5]]#测试集的特侦数据# 3.创建模型对象estimatorKNeighborsClassifier(n_neighbors2)# 4.模型训练estimator.fit(x_train,y_train)# 5、模型预测y_predictestimator.predict(x_test)print(y_predict)②KNN算法回归问题的API# 1.导包fromsklearn.neighborsimportKNeighborsRegressor# 2.准备数据集x_train[[0,0,1],[1,1,0],[3,10,10],[4,11,12]]#训练集的特诊数据特征可以是多个所以是二维数组y_train[0.1,0.2,0.3,0.4]#训练集的特征是连续的所以是一维数组x_test[[3,11,10]]#测试集的特征数据# 3.创建模型对象estimatorKNeighborsRegressor(n_neighbors3)# 4.模型训练estimator.fit(x_train,y_train)# 5、模型预测y_predictestimator.predict(x_test)print(f预测的数据是{y_predict})2.4距离度量之前我们已经学过了欧式距离的算法接下来我们还要学习其他距离的方法这里还是会介绍一下欧式距离①欧式距离②曼哈顿距离城市街区距离**曼哈顿距离**对应维度差值的绝对值之和③切比雪夫距离**切比雪夫距离**对应维度差值的绝对值求最大值④闵可夫斯基距离2.5数据预处理2.5.1归一化**归一化**通过对原始数据进行变换把数据映射到[min,max]之间默认为[0,1]**目的**防止因量纲单位差异导致特征列的方差相差过大从而影响模型的最终结果。所以通过公式把各列的值映射到[0,1]区间公式公式解释x是基于公式算出来的结果 x是最终的结果mx是区间最大值mi是区间的最小值**弊端**容易受到最大值和最小值的影响所以它一般用于处理小数据集数据归一化API# 导包fromsklearn.preprocessingimportMinMaxScaler#准备数据集x_train[[90,2,10,40],[60,4,15,45],[75,3,13,46]]#训练集的特征数据#创建归一化对象transferMinMaxScaler()#对原数据集进行归一化x_train_newtransfer.fit_transform(x_train)#打印处理后的数据print(归一化后的数据为\n)print(x_train_new)2.5.2标准化**标准化**通过对原数据进行数据标准化转化为均值为0标准差为1的标准正太分布的数据公式x (当前值-该列平均值/该列的标准差**使用场景**一般用于大数据的场景数据标准化API# 导包fromsklearn.preprocessingimportStandardScaler#准备数据集x_train[[90,2,10,40],[60,4,15,45],[75,3,13,46]]#训练集的特征数据#创建标准化对象transferStandardScaler()#对原数据集进行标准化x_train_newtransfer.fit_transform(x_train)#打印处理后的数据print(标准化后的数据为\n)print(x_train_new)#打印数据集的均值和方差print(f数据集的均值{transfer.mean_})print(f数据集的方差{transfer.var_})print(f数据集的标准差{transfer.scale_})注意事项**方差的计算公式**该列每个值 和 该列均值的差 的平方和 的平均值标准差的计算公式方差开平方根总结2.6鸢尾花案列使用KNN算法**目标**通过使用KNN算法去实现分别鸢尾花机器学习项目的步骤加载数据数据的预处理特征工程特征的提取和特征的预处理模型训练模型评估模型预测参考代码# 鸢尾花案列fromsklearn.datasetsimportload_iris# 加载鸢尾花测试集的。importseabornassnsimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_split,GridSearchCV# 分割训练集和测试集的fromsklearn.preprocessingimportStandardScaler# 数据标准化的fromsklearn.neighborsimportKNeighborsClassifier# KNN算法 分类对象fromsklearn.metricsimportaccuracy_score# 模型评估的计算模型预测的准确率#1、定义函数加载鸢尾花数据集并查看数据集defdm01_load_iris():#1、加载鸢尾花数据集iris_dataload_iris()#2、查看数据集#print(f数据集{iris_data}) #字典展示#3、查看数据集所有的键print(f数据集所有的键{iris_data.keys()})#4、查看数据集的键对应的值print(f数据)print(iris_data.data[:5])#一共有150条数据只展示前5条print(具体的标签)print(iris_data.target[:5])#一共有150条数据只展示前5条,只有012print(标签对应的名称)print(iris_data.target_names)#[‘setosa’ ‘versicolor’ ‘virginica’]print(数据集的特征名称)print(iris_data.feature_names)#[sepal length (cm), sepal width (cm), petal length (cm), petal width (cm)]# print(数据集的框架)# print(iris_data.frame) # None#2、定义函数绘制数据集的散点图defdm02_show_iris():# 1、加载鸢尾花数据集iris_dataload_iris()#2、把鸢尾花数据集封装成DateFrame对象iris_dfpd.DataFrame(iris_data.data,columnsiris_data.feature_names)#3、给df对象新增一个label列iris_df[label]iris_data.target#4、通过Seaborn绘制散点图# 参1是数据集参2是X轴参3是Y轴参4是分组字段参5是不绘制回归线sns.lmplot(datairis_df,xsepal length (cm),ysepal width (cm),huelabel,fit_regFalse)#5、显示图形plt.title(iris data)plt.tight_layout()# 自动调整子图参数使之填充整个图像区域plt.show()#3、定义函数切分训练集和测试集defdm03_split_train_test():# 1、加载鸢尾花数据集iris_dataload_iris()#2、数据的预处理从150个数据集中按照82的比例分割80%作为训练集20%作为测试集、#参1是特征数据参2是标签数据参3是测试集比例参4是随机种子种子一致每次生成的随机数据集是相同的x_train,x_test,y_train,y_testtrain_test_split(iris_data.data,iris_data.target,test_size0.2,random_state23)#3、打印切割后的结果print(f训练集的特征数据\n{x_train},个数{len(x_train)})# 120条数据每条4列特征print(f训练集的标签数据\n{y_train},个数{len(y_train)})# 120条数据每条1列标签print(f测试集的特征数据\n{x_test},个数{len(x_test)})# 30条数据每条4列特征print(f测试集的标签数据\n{y_test},个数{len(y_test)})# 30条数据每条1列标签#4、定义函数实现鸢尾花案列-》加载数据数据预处理特征工程模型训练模型评估模型预测defdm04_iris():#1、加载数据集iris_dataload_iris()#2、数据预处理将数据集按照82的比例切分为训练集和测试集x_train,x_test,y_train,y_testtrain_test_split(iris_data.data,iris_data.target,test_size0.2,random_state22)#3、特征工程提取预处理#特征提取因为原数据只有四个特征列并且都是我们需要使用的所以这不用特征提取#数据预处理因为源数据的4列特征差值不大所以我们无需做特征预处理但是加入特征预处理会让我们的代码更完善所以加入。#3.1 创建标准化对象transferStandardScaler()#3.2 对特征列进行标准化即x_train训练集的特征数据x_test:测试集的特征数据# fit_transform兼具训练和转换的功能适用于第一次进行标准化的数据集一般用于训练集x_traintransfer.fit_transform(x_train)#transform:只有转换功能适用于重复进行标准化的数据集一般用于测试集x_testtransfer.transform(x_test)#4、模型训练#4.1创建模型对象estimatorKNeighborsClassifier(n_neighbors3)#4.2模型训练estimator.fit(x_train,y_train)#5.模型预测#场景一对刚才切分的30条数据进行预测#5.1直接预测y_predictestimator.predict(x_test)print(f预测结果为{y_predict})#场景二对150条数据以外的数据进行预测# 5.1自定义数据集my_data[[7.8,2.1,3.9,1.6]]#5.2对数据集进行标准化处理my_datatransfer.transform(my_data)#5.3模型预测y_predict_newestimator.predict(my_data)print(f预测结果为{y_predict_new})#5.4查看上述数据集每种分类 的预测概率y_predict_probestimator.predict_proba(my_data)print(f各分类的预测结果{y_predict_prob})#[[0. 0.66666667 0.33333333]]-》0分类的概率、1分类的概率、2分来的概率#6模型评估#方式一直接评分基于训练集的特征和训练集的标签print(f正确率准确率{estimator.score(x_train,y_train)})#方式二基于测试集的标签和预测结果的进行评分更加专业print(f正确率准确率{accuracy_score(y_test,y_predict)})if__name____main__:# dm01_load_iris()#dm02_show_iris()#dm03_split_train_test()dm04_iris()2.7超参数选择方法对于超参数其实就是相当于在KNN算法中的k值对于k值的选取我们有以下几种方法交叉验证不是寻找最优超参的方法只是一个过程交叉验证法原理原理把数据分成n份例如分成4份第1次把第1份数据作为验证集测试集其他作为训练集训练模型模型预测获取准确率-准确率1第2次把第2份数据作为验证集测试集其他作为训练集训练模型模型预测获取准确率-准确率2第3次把第3份数据作为验证集测试集其他作为训练集训练模型模型预测获取准确率-准确率3第4次把第4份数据作为验证集测试集其他作为训练集训练模型模型预测获取准确率-准确率4然后计算上述的4次的准确率的平均值作为模型最终的准确率假设第4次最好也就是准确率最高则用全部数据训练集测试集训练模型再次用第4次的测试集对模型测试网格搜索原理接收超参所有可能出现的值然后针对于每一个值进行交叉验证获取到最优超参组合超参数需要用户手动输入的参数不同的超惨组合可能会影响模型的最终的预测结果**①第一种选择最优超参的方法**交叉验证网格搜索关于网格搜索和交叉验证的代码# 导入工具包fromsklearn.datasetsimportload_iris# 加载鸢尾花测试集的。fromsklearn.model_selectionimporttrain_test_split,GridSearchCV# 分割训练集和测试集的寻找最优超参的网格搜索和交叉验证。fromsklearn.preprocessingimportStandardScaler# 数据标准化的fromsklearn.neighborsimportKNeighborsClassifier# KNN算法 分类对象fromsklearn.metricsimportaccuracy_score# 模型评估的计算模型预测的准确率#1、加载鸢尾花数据集iris_dataload_iris()#2、数据切分分为训练集和测试集比例82x_train,x_test,y_train,y_testtrain_test_split(iris_data.data,iris_data.target,test_size0.2,random_state22)#3、特征工程—特征预处理-数据标准化#3.1创建标准化对象transferStandardScaler()#3.2对训练集和测试集的特征进行标准化x_traintransfer.fit_transform(x_train)x_testtransfer.transform(x_test)#4、模型训练#4.1创建KNN分类对象estimatorKNeighborsClassifier()#4.2定义字典记录超惨可能出现的情况param_dict{n_neighbors:[iforiinrange(1,11)]}#4.3创建GridSearchCV对象-寻找最优超参使用网格搜索交叉验证#参1要计算最优超参的模型对象参2该模型超参可能出现的值参3交叉验证的折数这里的4折表示每一个超参组合都会进行4次交叉验证一共是4*10次#返回值estimatorestimatorGridSearchCV(estimator,param_dict,cv4)#4.4模型训练estimator.fit(x_train,y_train)#4.5打印最优超参组合print(f最优评分:{estimator.best_score_})print(f最优超参组合:{estimator.best_params_})print(f最优的估计对象:{estimator.best_estimator_})print(f具体的交叉验证结果:{estimator.cv_results_})#5.模型评估#5.1获取最优超参estimatorestimator.best_estimator_#获取最优的模型对象#也可以这样写因为在第4步已经算出来了estimator即estimator KNeighborsClassifier(estimator3)#5.2模型训练estimator.fit(x_train,y_train)#5.3模型预测y_predictestimator.predict(x_test)#5.4模型评估#参1测试集参2预测集print(f准确率{accuracy_score(y_test,y_predict)})2.8利用KNN算法实现手写数字识别以下的代码就包括了训练模型并保存训练好的模型#2、定义函数训练模型并保存训练好的模型deftrain_model():# 1、读取数据集获取数据源dfpd.read_csv(手写数字识别.csv)#2、数据的预处理#2.1拆分出特征列xdf.iloc[:,1:]#第一个冒号表示所有行1表示从第一行开始然后第二个冒号就是代表所有列特征列# 2.2拆分出标签列ydf.iloc[:,0]#第一个冒号表示所有行0表示第一列目标列#2.3打印出特征列和标签列print(fx的形状{x.shape})print(fy的形状{y.shape})print(f所有标签的分布情况{Counter(y)})#2.4对特征列拆分前进行归一化操作x(x-0)/(255-0)#2.5拆分训练集和测试集# 参1特征列参2标签列参3测试集占比参4随机种子参5参考y值进行抽取保持标签的比率数据均衡x_train,x_test,y_train,y_testtrain_test_split(x,y,test_size0.2,random_state23,stratifyy)#3、模型训练#3.1创建模型对象estimatorKNeighborsClassifier(n_neighbors3)#3.2模型训练estimator.fit(x_train,y_train)#4、模型评估print(f准确率{estimator.score(x_test,y_test)})print(f准确率{accuracy_score(y_test,estimator.predict(x_test))})#5、保存模型#参1模型对象参2保存路径joblib.dump(estimator,./my_model/手写数字识别.pkl)#pickle文件python独有的文件格式if__name____main__:#绘制数字#show_digit(9)#训练模型和保存模型train_model()如下的代码就是使用保存后的模型#3、定义函数测试模型defmy_test_model():#1、加载图片imgplt.imread(demo.png)# 28*28像素#2、 绘制图片plt.imshow(img,cmapgray)plt.show()#3、加载模型estimatorjoblib.load(./my_model/手写数字识别.pkl)#4、模型预测#4.1查看数据转换print(img.shape)#28*28print(img.reshape(1,-1).shape)#(1.784) img.reshape(1,-1)等同于img.reshape(1,784)-1就是表示这一行的所有列#4.2具体的转换操作记得归一化因为训练模型的时候使用了归一化imgimg.reshape(1,-1)/(255-0)#4.3模型预测y_predictestimator.predict(img)#5、打印预测结果print(f预测结果是{y_predict})if__name____main__:#绘制数字#show_digit(9)#训练模型和保存模型#train_model()#使用模型my_test_model()以上就是机器学习的第一章和第二章有错误请各位大佬指出