KNN算法
# 模型参数与超参数 # 模型参数是模型内部的配置变量,可以用数据估计模型参数的值;模型超参数是模型外部的配置,必须手动设置参数的值。 # 交叉验证 # 我们解决机器学习问题的一般步骤: # 数据预处理:重复缺失异常值处理,特征选择,特征变换,特征降维 # 数据建模:机器学习的问题分为两类:分类和回归,我们根据问题选择合适的模型 # 模型评估:对模型的预测结果做一个评估,常用指标accuracy,recall,F1,PRC,ROC_AUC,IOU等等。 #交叉验证就是我们模型评估的一个有效的手段。 # 如果我们把用于训练的数据集去验证模型,那么就很容易出现过拟合。所以一般我们把数据集分为训练集和测试集,但是这样也会出现很多的问题。 # 举个栗子,我们平时做的模拟题就是训练集,考试试卷就是测试集,如果考试的时候全是平时做过的模拟原题,那还有什么意义呢,全都是满分, # 实际上真的有满分的水平嘛,再出一道没做过的题目还是不会,这个情况就是过拟合。但是模拟题过简单,考试题过难,这样结果也不理想。 # 为了让我们的模型充分 反应真实效果,我们引入了交叉验证。 # 交叉验证的基本思想是把在某种意义下将原始数据进行分组,一部分做为训练集,另一部分做为验证集,首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型, # 以此来做为评价分类器的性能指标。如上图所示,我们将训练集平均分成十份,每次将序号递增的一份拿出来当作测试集,其余九份作为训练集,然后迭代十次, # 将10次的结果进行平均,以此作为模型的指标。 # 线性回归和KNN的区别 # 1)KNN既可以做回归,也可以做分类。那么如果要做回归的话,什么时候用线性回归什么时候用KNN呢?事实证明,如果数据之间线性关系比较明显的话, # 线性回归会优于KNN,如果数据之间线性关系不明显的话,KNN会比较好一些。但总得来说,这两个都是机器学习中最简单,最基础的模型。 # 随着维度的上升,这两个模型,尤其是KNN会面临失效的问题,这就是所谓的维度灾难 # 2)线性回归不受纲量的影响,KNN受纲量的影响,所以KNN最好需要先进行标准化处理。 # KNN算法 # KNN(K-Nearest Neighbor)是最简单的机器学习算法之一,可以用于分类和回归,是一种监督学习算法。 # 它的思路是这样,如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 # 也就是说,该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别 # 超参数 # n_neighbors # weights uniform,distance # 建模 # from sklearn.neighbors import KNeighborsRegressor,KNeighborsClassifier # x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=3) # knn = KNeighborsRegressor() # knn.fit(x_train,y_train) # 超参数调整 # 借助 GridSearchCV 网格搜索 # 应用场景: 选择合适的超参数 # 这是一种机器学习模型通常都会用到的模型调参方法,它能够返回最好的模型参数组合,采用这些参数建模便能得到最好的模型 # from sklearn.model_selection import GridSearchCV # parameters = {'n_neighbors':range(1,10),'weights':['uniform','distance']} # 定义需要尝试的超参数组合 # clf = GridSearchCV(estimator=knn,param_grid=parameters,n_jobs=-1,scoring='r2',cv=5,verbose=10) # scoring 根据线性回归还是逻辑回归,选择不同的模型评估标准。线性-->R2,MSE 逻辑--> f1,recall,accuracy # estimator 评估器,即对哪个模型调整超参数 # cv 交叉验证折数 # clf.fit(x_train,y_train) # clf.best_score_ # clf.best_estimator_ # 最好的超参数训练好的模型。已经训练好了,直接拿来用,不用再fit了!!! # clf.best_estimator_.predict(x_test) # print(clf.best_estimator_.score(x_train,y_train)) # print(clf.best_estimator_.score(x_test,y_test)) # 数据标准化 # 实际也是属于预处理的一种 # from sklearn.preprocessing import StandardScaler,MinMaxScaler # scaler = MinMaxScaler() # x_train_sca = scaler.fit_transform(x_train) 对测试集和训练集使用的方法不同。 # x_test_sca = scaler.transform(x_test) # knn.fit(x_train_sca,y_train) # print(knn.score(x_train_sca,y_train)) # print(knn.score(x_test_sca,y_test)) # 流水线 # Pipeline可以将许多算法模型串联起来,比如将特征提取、归一化、分类组织在一起形成一个典型的机器学习问题工作流。主要带来两点好处: # 1、直接调用fit和predict方法来对pipeline中的所有算法模型进行训练和预测。 # 2、可以结合grid search对参数进行选择。 # 注意: # 除了最后一个tansform,其余的transform必须实现fit_transform函数 # 在自定义transform类时,必须要实现fit_transform函数,因为fit_transform是下一个transform的参数 # 每一步transform返回的值是numpy的array形式数据 # 流水线可以将每个评估器视为一个步骤,然后将多个步骤作为一个整体而依次执行。 # 流水线具有最后一个评估器的所有方法,当通过流水线对象调用方法时,会执行这样的过程: # 如果是fit方法,则会对前n-1个评估器依次调用fit_transform方法,然后在最后一个评估器上调用fit方法 # 如果是其它(eg:predict)方法,则会对前n-1个评估器依次调用transform方法,然后在最后一个评估器上调用该方法(predict)。 # from sklearn.pipeline import Pipeline # steps = [('scaler',MinMaxScaler()),('knn',KNeighborsRegressor())] # p = Pipeline(steps=steps) # p.set_params(knn__n_neighbors=5,knn__weights='distance') # p.fit(x_train,y_train) # print(p.score(x_train,y_train)) # print(p.score(x_test,y_test))
朴素贝叶斯