Python机器学习(十)经典算法大全

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2021.12.12

由于knn算法涉及到距离的概念,KNN算法需要先进行归一化处理

fromsklearn.preprocessingimportStandardScalerstandardScaler=StandardScaler()standardScaler.fit(X_train)X_train_standard=standardScaler.transform(X_train)X_test_standard=standardScaler.transform(X_test)归一化之后送入模型进行训练

fromsklearn.neighborsimportKNeighborsClassifierknn_clf=KNeighborsClassifier(n_neighbors=8)knn_classifier.fit(X_train_standard,y_train)y_predict=knn_clf.predict(X_test_standard)#默认的预测指标为分类准确度knn_clf.score(X_test,y_test)1.2网格搜索GridSearchCV使用网格搜索来确定KNN算法合适的超参数

fromsklearn.neighborsimportKNeighborsClassifierknn_clf=KNeighborsClassifier(n_neighbors=8)knn_classifier.fit(X_train_standard,y_train)y_predict=knn_clf.predict(X_test_standard)#默认的预测指标为分类准确度knn_clf.score(X_test,y_test)1.3交叉验证defcv_score_train_test(model):num_cv=5score_list=["accuracy","f1","neg_log_loss","roc_auc"]forscoreinscore_list:print(score,"\ttrain:",cross_val_score(model,X_train,y_train,cv=num_cv,scoring=score).mean())print(score,"\ttest:",cross_val_score(model,X_test,y_test,cv=num_cv,scoring=score).mean())2.线性回归2.1简单线性回归fromsklearn.linear_modelimportLinearRegressionlinreg=LinearRegression()linreg.fit(X_train,y_train)#查看截距和系数printlinreg.intercept_printlinreg.coef_lin_reg.score(X_test,y_test)y_predict=linreg.predict(X_test)2.2多元线性回归在更高维度的空间中的“直线”,即数据不只有一个维度,而具有多个维度

代码和上面的简单线性回归相同

使用梯度下降法之前,需要对数据进行归一化处理

回到顶部

SGD_reg

fromsklearn.linear_modelimportSGDRegressorsgd_reg=SGDRegressor(max_iter=100)sgd_reg.fit(X_train_standard,y_train_boston)sgd_reg.score(X_test_standard,y_test_boston)3.2确定梯度下降计算的准确性以多元线性回归的目标函数(损失函数)为例

比较使用数学推导式(得出具体解析解)的方法和debug的近似方法的比较

PCA算法不能在前处理进行归一化处理,否则将会找不到主成分

#对于二维的数据样本来说fromsklearn.decompositionimportPCApca=PCA(n_components=1)#指定需要保留的前n个主成分,不指定为默认保留所有pca.fit(X)比如,要使用KNN分类算法,先进行数据的降维操作

fromsklearn.decompositionimportPCApca=PCA(n_components=2)#这里也可以给一个百分比,代表想要保留的数据的方差占比pca.fit(X_train)#训练集和测试集需要进行相同降维处理操作X_train_reduction=pca.transform(X_train)X_test_reduction=pca.transform(X_test)#降维完成后就可以送给模型进行拟合knn_clf=KNeighborsClassifier()knn_clf.fit(X_train_reduction,y_train)knn_clf.score(X_test_reduction,y_test)4.2降维的维数和精度的取舍指定的维数,能解释原数据的方差的比例

pca.explained_variance_ratio_#指定保留所有的主成分pca=PCA(n_components=X_train.shape[1])pca.fit(X_train)pca.explained_variance_ratio_#查看降维后特征的维数pca.n_components_把数据降维到2维,可以进行scatter的可视化操作

先使用pca降维,之后再反向,升维

fromsklearn.decompositionimportPCApca=PCA(0.7)pca.fit(X)pca.n_components_X_reduction=pca.transform(X)X_inversed=pca.inverse_transform(X_reduction)5.多项式回归与模型泛化多项式回顾需要指定最高的阶数,degree

拟合的将不再是一条直线

如果非要把上两者写在一起,应该把指定好param_grid参数的grid_search作为成员,传递给Pipeline

首先明确:

fromsklearn.linear_modelimportRidgefromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.preprocessingimportStandardScalerfromsklearn.pipelineimportPipelinedefRidgeRegression(degree,alpha):returnPipeline([("poly",PolynomialFeatures(degree=degree)),("std_scaler",StandardScaler()),("ridge_reg",Ridge(alpha=alpha))])ridge_reg=RidgeRegression(degree=20,alpha=0.0001)ridge_reg.fit(X_train,y_train)y_predict=ridge_reg.predict(X_test)mean_squared_error(y_test,y_predict)代码中:

alpha为L2正则项前面的系数,代表的含义与LASSO回归相同

Ridge回归、LASSO回归的区别

fromsklearn.linear_modelimportLassofromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.preprocessingimportStandardScalerfromsklearn.pipelineimportPipelinedefLassoRegression(degree,alpha):returnPipeline([("poly",PolynomialFeatures(degree=degree)),("std_scaler",StandardScaler()),("lasso_reg",Lasso(alpha=alpha))])lasso_reg=LassoRegression(3,0.01)lasso_reg.fit(X_train,y_train)y_predict=lasso_reg.predict(X_test)mean_squared_error(y_test,y_predict)6.逻辑回归将样本特征与样本发生的概率联系起来。

plot_decision_boundary(poly_log_reg,axis=[-4,4,-4,4])plt.scatter(X[y==0,0],X[y==0,1])plt.scatter(X[y==1,0],X[y==1,1])plt.show()6.3逻辑回归中的正则化项和惩罚系数C公式为:

C*J(θ)+L1

C*J(θ)+L2

上式中:

scikit封装了OvOOvR这两个类,方便其他二分类算法,使用这两个类实现多分类

例子中:log_reg是已经创建好的逻辑回归二分类器

fromsklearn.multiclassimportOneVsRestClassifierovr=OneVsRestClassifier(log_reg)ovr.fit(X_train,y_train)ovr.score(X_test,y_test)fromsklearn.multiclassimportOneVsOneClassifierovo=OneVsOneClassifier(log_reg)ovo.fit(X_train,y_train)ovo.score(X_test,y_test)7.支撑向量机SVM注意

支撑向量机要满足的优化目标是:

使“最优决策边界”到与两个类别的最近的样本的距离最远

即,使得margin最大化

分为:

为了改善SVM模型的泛化能力,需要进行正则化处理,同样有L1、L2正则化

正则化即弱化限定条件,使得某些样本可以不再Margin区域内

惩罚系数C是乘在正则项前面的

min12||w||2+C∑i=1mξi,L1正则项min12||w||2+C∑i=1mξi,L1正则项

min12||w||2+C∑i=1mξ2i,L2正则项min12||w||2+C∑i=1mξi2,L2正则项

变化规律:

fromsklearn.preprocessingimportStandardScalerstandardScaler=StandardScaler()standardScaler.fit(X)X_standard=standardScaler.transform(X)fromsklearn.svmimportLinearSVCsvc=LinearSVC(C=1e9)svc.fit(X_standard,y)简洁起见,可以用Pipeline包装起来

fromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportLinearSVCfromsklearn.pipelineimportPipelinedefLinear_svc(C=1.0):returnPipeline([("std_scaler",StandardScaler()),("linearSVC",LinearSVC(C=C))])linear_svc=Linear_svc(C=1e5)linear_svc.fit(X,y)7.3多项式特征SVM明确:使用多项式核函数的目的都是将数据升维,使得原本线性不可分的数据变得线性可分

在SVM中使用多项式特征有两种方式

fromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportSVCfromsklearn.pipelineimportPipelinedefRBFkernelSVC(gamma=1.0):returnPipeline([("std_standard",StandardScaler()),("svc",SVC(kernel="rbf",gamma=gamma))])svc=RBFkernelSVC(gamma=1.0)svc.fit(X,y)超参数gammaγγ规律:

若gamma太大,会造成过拟合

若gamma太小,会造成欠拟合,决策边界变为直线

指定margin区域垂直方向上的距离epsilon

通用可以分为线性SVR和多项式SVR

fromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportLinearSVRfromsklearn.svmimportSVRfromsklearn.pipelineimportPipelinedefStandardLinearSVR(epsilon=0.1):returnPipeline([("std_scaler",StandardScaler()),("linearSVR",LinearSVR(epsilon=epsilon))])svr=StandardLinearSVR()svr.fit(X_train,y_train)svr.score(X_test,y_test)#可以使用cross_val_score来获得交叉验证的成绩,成绩更加准确8.决策树非参数学习算法、天然可解决多分类问题、可解决回归问题(取叶子结点的平均值)、非常容易产生过拟合

可以考虑使用网格搜索来寻找最优的超参数

划分的依据有基于信息熵、基于基尼系数(scikit默认用gini,两者没有特别优劣之分)

ID3、C4.5都是使用“entropy"评判方式

CART(ClassificationandRegressionTree)使用的是“gini"评判方式

常用超参数:

fromsklearn.treeimportDecisionTreeClassifierdt_clf=DecisionTreeClassifier(max_depth=2,criterion="gini")#dt_clf=DecisionTreeClassifier(max_depth=2,criterion="entropy")dt_clf.fit(X,y)8.2回归fromsklearn.treeimportDecisionTreeRegressordt_reg=DecisionTreeRegressor()dt_reg.fit(X_train,y_train)dt_reg.score(X_test,y_test)#计算的是R2值9.集成学习和随机森林9.1HardVotingClassifier把几种分类模型包装在一起,根据每种模型的投票结果来得出最终预测类别

可以先使用网格搜索把每种模型的参数调至最优,再来Voting

所以,每种模型都应该能估计结果的概率

(2)这类集成学习方法需要指定一个baseestimator

(3)放回取样,会存在oob(outofbag)的样本数据,比例约37%,正好作为测试集

obb_score=True/False,是否使用oob作为测试集

(4)产生差异化的方式:

random_subspaces_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_samples=500,bootstrap=True,oob_score=True,n_jobs=-1,max_features=1,bootstrap_features=True)random_subspaces_clf.fit(X,y)random_subspaces_clf.oob_score_random_patches_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_samples=100,bootstrap=True,oob_score=True,n_jobs=-1,max_features=1,bootstrap_features=True)random_patches_clf.fit(X,y)random_patches_clf.oob_score_参数解释:

max_samples:如果和样本总数一致,则不进行样本随机采样

max_features:指定随机采样特征的个数(应小于样本维数)

bootstrap_features:指定是否进行随机特征采样

oob_score:指定是都用oob样本来评分

bootstrap:指定是否进行放回取样

随机森林是指定了BaseEstimator为DecisionTree的Bagging集成学习模型

已经被scikit封装好,可以直接使用

特点:

决策树在结点划分上,使用随机的特征和阈值

提供了额外的随机性,可以抑制过拟合,但会增大Bias(偏差)

具有更快的训练速度

fromsklearn.ensembleimportExtraTreesRegressoret_clf=ExtraTreesClassifier(n_estimators=500,bootstrap=True,oob_score=True,random_state=666)et_clf.fit(X,y)et_clf.oob_score_9.5AdaBoosting每个子模型模型都在尝试增强(boost)整体的效果,通过不断的模型迭代,更新样本点的权重

AdaBoosting没有oob的样本,因此需要进行train_test_split

需要指定BaseEstimator

fromsklearn.ensembleimportAdaBoostClassifierfromsklearn.treeimportDecisionTreeClassifierada_clf=AdaBoostClassifier(DecisionTreeClassifier(max_depth=2),n_estimators=500)ada_clf.fit(X_train,y_train)ada_clf.score(X_test,y_test)9.6GradientBoosting训练一个模型m1,产生错误e1

针对e1训练第二个模型m2,产生错误e2

针对e2训练第二个模型m3,产生错误e3

......

最终的预测模型是:m1+m2+m3+...m1+m2+m3+...

GradientBoosting是基于决策树的,不用指定BaseEstimator

fromsklearn.ensembleimportGradientBoostingClassifiergb_clf=GradientBoostingClassifier(max_depth=2,n_estimators=30)gb_clf.fit(X_train,y_train)gb_clf.score(X_test,y_test)总结上述提到的集成学习模型,不仅可以用于解决分类问题,也可解决回归问题

fromsklearn.ensembleimportBaggingRegressorfromsklearn.ensembleimportRandomForestRegressorfromsklearn.ensembleimportExtraTreesRegressorfromsklearn.ensembleimportAdaBoostRegressorfromsklearn.ensembleimportGradientBoostingRegressor例子:决策树和AdaBoosting回归问题效果对比

本例的notebook笔记文件:git仓库

实例代码:

frommatplotlibimportpyplotaspltfromsklearn.metricsimportaccuracy_scoreimportnumpyasnpimportseabornassns;sns.set()%matplotlibinline10.1传统K-means聚类构造数据集

fromsklearn.datasets.samples_generatorimportmake_blobsX,y_true=make_blobs(n_samples=300,centers=4,cluster_std=0.60,random_state=0)plt.scatter(X[:,0],X[:,1],s=50)fromsklearn.clusterimportKMeanskmeans=KMeans(n_clusters=4)kmeans.fit(X)y_kmeans=kmeans.predict(X)绘制聚类结果,画出聚类中心

构造数据

fromsklearn.datasetsimportmake_moonsX,y=make_moons(200,noise=0.05,random_state=0)传统kmeans聚类失败的情况

fromsklearn.datasetsimportload_digitsdigits=load_digits()进行聚类

kmeans=KMeans(n_clusters=10,random_state=0)clusters=kmeans.fit_predict(digits.data)kmeans.cluster_centers_.shape(10,64)可以将这些族中心点看做是具有代表性的数字

通过流形学习

投影到低维空间

且k-means算法只对简单的,分离性能好的,并且是圆形分布的数据有比较好的效果

本例中所有代码的实现已上传至git仓库

通过实例来观察K-means算法的缺陷

半径是根据最远的点与族中心点的距离算出

下面用一个函数将这个聚类圆圈可视化

在默认参数设置的、数据简单可分的情况下,

GMM的分类效果与k-means基本相同

probs=gmm.predict_proba(X)print(probs[:5].round(3))[[0.0.4690.0.531][1.0.0.0.][1.0.0.0.][0.0.0.1.][1.0.0.0.]]编写绘制gmm绘制边界的函数

一个GMM拟合的结果并不是一个聚类模型,而是描述数据分布的生成概率模型。

分布函数的生成模型可以生成新的,与输入数据类似的随机分布函数(生成新的数据点)

用GMM拟合原始数据获得的16个成分生成的400个新数据点

常用指标选择方式

平衡分类问题:

分类准确度、ROC曲线

类别不平衡问题:

精准率、召回率

对于二分类问题,常用的指标是f1、roc_auc

多分类问题,可用的指标为f1_weighted

一般用于平衡分类问题(每个类比的可能性相同)

fromsklearn.metricsimportaccuracy_scoreaccuracy_score(y_test,y_predict)#(真值,预测值)2.混淆矩阵、精准率、召回率#先真实值,后预测值fromsklearn.metricsimportconfusion_matrixconfusion_matrix(y_test,y_log_predict)fromsklearn.metricsimportprecision_scoreprecision_score(y_test,y_log_predict)fromsklearn.metricsimportrecall_scorerecall_score(y_test,y_log_predict)多分类问题中的混淆矩阵

fromsklearn.metricsimportprecision_scoreprecision_score(y_test,y_predict,average="micro")fromsklearn.metricsimportconfusion_matrixconfusion_matrix(y_test,y_predict)cfm=confusion_matrix(y_test,y_predict)row_sums=np.sum(cfm,axis=1)err_matrix=cfm/row_sumsnp.fill_diagonal(err_matrix,0)plt.matshow(err_matrix,cmap=plt.cm.gray)plt.show()3.F1-scoreF1-score是精准率precision和召回率recall的调和平均数

fromsklearn.metricsimportf1_scoref1_score(y_test,y_predict)4.精准率和召回率的平衡可以通过调整阈值,改变精确率和召回率(默认阈值为0)

但是,这个最大的threshold没有对应的值

因此thresholds会少一个

绘制ROC曲线

fromsklearn.metricsimportroc_curvefprs,tprs,thresholds=roc_curve(y_test,decision_scores)plt.plot(fprs,tprs)plt.show()计算ROC曲线下方的面积的函数

roc_area_under_curve_score

fromsklearn.metricsimportroc_auc_scoreroc_auc_score(y_test,decision_scores)曲线下方的面积可用于比较两个模型的好坏

总之,上面提到的decision_score是一个概率值,如01二分类问题,应该是将每个样本预测为1的概率,

如某个样本的y_test为1,y_predict_probablity为0.875

每个测试样本对应一个预测的概率值

通常在模型fit完成之后,都会有相应的得到概率的函数,如

model.predict_prob(X_test)

model.decision_function(X_test)

fromsklearn.metricsimportmean_squared_errormean_squared_error(y_test,y_predict)2.平均绝对值误差MAEfromsklearn.metricsimportmean_absolute_errormean_absolute_error(y_test,y_predict)3.均方根误差RMSEscikit中没有单独定于均方根误差,需要自己对均方误差MSE开平方根

fromsklearn.metricsimportr2_scorer2_score(y_test,y_predict)5.学习曲线观察模型在训练数据集和测试数据集上的评分,随着训练数据集样本数增加的变化趋势。

THE END
1.python机器学习算法之决策树入门讲解决策树分类算法python4.局部最优解:决策树构建时使用贪婪算法,可能导致生成局部最优的树结构,而不一定是全局最优。这可能需要在多个不同的初始条件下训练多个决策树来减轻这一问题。 5.特征连续性处理:决策树通常将特征看作离散值,不擅长处理连续特征。尽管有方法可以将连续特征处理为离散特征,但这增加了复杂性。 https://blog.csdn.net/2301_82059354/article/details/144252079
2.回归二分类和多分类交叉验证交叉熵损失函数k使用该参数方案对整个训练数据集训练之后,得到最后的f函数。 04 为什么逻辑回归采用交叉熵损失函数,而不是平方损失函数? 我的作答: 因为交叉熵损失函数能够体现逻辑回归的预测结果与真实值之间的相关程度,而平方损失函数只能简单地计算预测https://mp.weixin.qq.com/s?__biz=Mzg4MzcxMjIzMQ==&mid=2247487593&idx=2&sn=d3964fd19f5a13282aa2c22b6dbacff7&chksm=cee34e498619c573b898af986c0fe8ec1202474a05301d131f366b29771e77f6cf011dfd0771&scene=27
3.python机器学习笔记:深入学习决策树算法原理特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准,从而衍生出不同的决策树算法。 1.2 决策树生成 根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。树结构来说,递归结构是最容易理解的方式。 https://www.flyai.com/article/622
4.python实现决策树C4.5算法详解(在ID3基础上改进)python下面小编就为大家带来一篇python实现决策树C4.5算法详解(在ID3基础上改进)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 一、概论 C4.5主要是在ID3的基础上改进,ID3选择(属性)树节点是选择信息增益值最大的属性作为节点。而C4.5引入了新概念“信息增益率”,C4.5是选择信息增益率https://www.jb51.net/article/115025.htm
5.增强回归树模型mob64ca1411e411的技术博客在前面决策树的介绍中,我们使用ID3算法来构建决策树;这里我们使用CART算法来构建回归树和模型树。ID3算法是每次选取当前最佳的特征来分割数据,并按照该特征的所有可能取值来区分。比如,如果一个特征有4种取值,那么数据将被切分成4份。很明显,该算法不适用于标签值为连续型的数据。 https://blog.51cto.com/u_16213690/12764986
6.机器学习——全套PPT课件.pptx机器学习概述复旦大学赵卫东博士第1章机器学习基础.pptx第2章机器学习基本方法PCA和SVD.pptx第2章机器学习基本方法回归分析.pptx第2章机器学习基本方法可视化.pptx第3章决策树与分类算法.pptx第4章1聚类分析.pptx第4章2EM算法.pptx第5章文本分析.pptx第6章神经网络.pptx第7章贝叶斯网络.pptx第8章支持向量机.pptxhttps://m.book118.com/html/2024/0909/6125221241010220.shtm
7.基于聚类分析和决策树算法的装车工时预测模型其特征在于:它包括聚类分析算法模块和决策树算法模块,所述预测模型将历史数据通过聚类分析算法,划分时长区间,进而得出决策树算法的分类方案,再通过历史数据输入包括包装方式、吊装方式等影响最终装车工时的属性集合,与聚类分析的分类方案联系起来,利用C4.5决策树算法生成最终的决策树数据模型,最终来预测出未来的装车工时;https://wenku.baidu.com/view/682051b2cf1755270722192e453610661fd95ac7.html
8.常用数据挖掘算法总结及Python实现第四章 KNN(k 最邻近分类算法)16 第五章 决策树19 第六章 朴素贝叶斯分类https://www.modb.pro/db/1798520229306912768
9.决策树——ID3C4.5CART决策树ID3算法的过程为: 输入:训练数据集 ,每个样本有 个离散特征,特征集合为 ; 输出:决策树 。 1 初始化信息增益的阈值 ; 2 判断样本是否为同一类输出 ,如果是则返回单节点树 ,标记类别为 ; 3 判断特征 是否为空,如果是,则返回单节点树 ,标记类别为样本中输出类别 https://www.jianshu.com/p/3acd4150db05