你好%username%!我叫Alex,我涉猎机器学习和网络图分析(主要是理论)。我也在为一家俄罗斯移动运营商开发大数据产品。第一次在网上写文章,不喜勿喷。现在,很多人都想开发高效的算法,参加机器学习竞赛。所以他们来找我,问:“我该如何开始?”。前段时间,我在俄罗斯联邦政府的一个机构领导了媒体和社交网络大数据分析工具的开发。我仍然有一些我的团队使用过的文档,我很乐意与您分享。前提是读者已经具备良好的数学和机器学习知识(我的团队主要由MIPT(莫斯科物理技术大学)和数据分析研究所的毕业生组成)。这篇文章是对数据科学的介绍,这门学科如今风靡一时。机器学习方面的竞赛也越来越多(例如,Kaggle、TudedIT),而且他们的资助通常很可观。R和Python是提供给数据科学家的两种最常用的工具。每个工具都有其优点和缺点,但Python最近在所有方面都胜出(只是我的愚见,虽然我同时使用两者)。这一切的发生都是因为Scikit-Learn库,它包含完善的文档和丰富的机器学习算法。请注意,我们将在本文中主要探索机器学习算法。主数据分析最好使用Pandas包,而且自己也很容易做到。所以,让我们把重点放在实施上。对于确定性,我们假设一个特征对象矩阵作为输入,存储在*.csv文件中。数据加载首先,数据必须先加载到内存中,然后才能对其进行操作。Scikit-Learn库在其实现中使用NumPy数组,因此我们将使用NumPy加载*.csv文件。让我们从UCI机器学习存储库下载其中一个数据集。importnumpyasnpimporturllib#urlwithdataseturl="http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"#下载文件raw_data=urllib.urlopen(url)#将CSV文件加载为numpymatrixdataset=np.loadtxt(raw_data,delimiter=",")#将数据与目标属性分开X=dataset[:,0:7]y=dataset[:,8]我们将在以下所有示例中使用此数据集,换句话说,X特征数组和y目标变量值。数据归一化我们都知道大多数梯度方法(几乎所有机器学习算法都基于此)对数据缩放很敏感。因此,在运行算法之前,我们应该进行归一化,也就是所谓的归一化。归一化涉及替换所有特征的标称值,使每个特征的值都介于0和1之间。而对于归一化,它包括对数据进行预处理,使每个特征的值具有0和1的离散度.Scikit-Learn库已经为它提供了相应的功能。fromsklearnimportmetricsfromsklearn.ensembleimportExtraTreesClassifiermodel=ExtraTreesClassifier()model.fit(X,y)#显示各个属性的相对重要性print(model.feature_importances_)特征选择毫无疑问,解决一个问题最重要是合适的选择特征的能力,甚至是创建特征的能力。这称为特征选择和特征工程。虽然特征工程是一个非常有创造性的过程,有时更多的是基于直觉和专业知识,但是对于特征的选择,已经有很多算法可以直接使用。例如,树算法可以计算特征的信息量。fromsklearnimportmetricsfromsklearn.ensembleimportExtraTreesClassifiermodel=ExtraTreesClassifier()model.fit(X,y)#显示每个属性的相对重要性print(model.feature_importances_)其他所有方法都是基于特征子集的高效搜索,从而找到最好的子集意味着进化模型在这个子集上具有最好的质量。递归特征消除(RFE)是这些搜索算法之一,也由Scikit-Learn库提供。fromsklearn.feature_selectionimportRFEfromsklearn.linear_modelimportLogisticRegressionmodel=LogisticRegression()#创建RFE模型并选择3个属性rfe=RFE(model,3)rfe=rfe.fit(X,y)#总结属性的选择print(rfe.support_)print(rfe.ranking_)算法开发正如我所说,Scikit-Learn库已经实现了所有基本的机器学习算法。让我看一下其中的一些。逻辑回归主要用于解决分类问题(二元分类),但多类分类(所谓的一对多方法)也适用。该算法的优点是对于每个输出对象都有对应类别的概率。fromsklearnimportmetricsfromsklearn.linear_modelimportLogisticRegressionmodel=LogisticRegression()model.fit(X,y)print(model)#makepredictionsexpected=ypredicted=model.predict(X)#总结模型的拟合度print(metrics.classification_report(expected,predicted))print(metrics.confusion_matrix(expected,predicted))朴素贝叶斯也是最著名的机器学习算法之一,其主要任务是还原训练样本的数据分布密度。这种方法通常在多类分类问题上表现良好。fromsklearnimportmetricsfromsklearn.naive_bayesimportGaussianNBmodel=GaussianNB()model.fit(X,y)print(model)#makepredictionsexpected=ypredicted=model.predict(X)#总结模型的拟合度print(metrics.classification_report(expected,predicted))print(metrics.confusion_matrix(expected,predicted))k近邻kNN(k-nearestneighbor)方法经常被用作更复杂的分类算法的一部分。例如,我们可以将其估计值用作对象的特征。有时,一个简单的kNN算法可以在精心选择的特征上表现得非常好。当参数(主要是指标)设置得当时,该算法通常在回归问题中表现出最好的质量。fromsklearnimportmetricsfromsklearn.neighborsimportKNeighborsClassifier#将k最近邻模型拟合到数据模型=KNeighborsClassifier()model.fit(X,y)print(model)#makepredictionsexpected=ypredicted=model.predict(X)#summarizefitofthemodelprint(metrics.classification_report(expected,predicted))print(metrics.confusion_matrix(expected,predicted))决策树分类和回归树(CART)通常用于一类问题,其中对象具有可分类的特征和用于回归和分类问题。决策树非常适合多类分类。fromsklearnimportmetricsfromsklearn.treeimportDecisionTreeClassifier#fitaCARTmodeltothedatamodel=DecisionTreeClassifier()model.fit(X,y)print(model)#makepredictionsexpected=ypredicted=model.predict(X)#总结拟合模型print(metrics.classification_report(expected,predicted))print(metrics.confusion_matrix(expected,predicted))支持向量机SVM(SupportVectorMachine)是最新的机器学习算法之一,它主要用于分类问题。SVM也用于逻辑回归,可以借助一对多方法实现多类分类。fromsklearnimportmetricsfromsklearn.svmimportSVC#fitaSVMmodeltothedatamodel=SVC()model.fit(X,y)print(model)#makepredictionsexpected=ypredicted=model.predict(X)#总结拟合modelprint(metrics.classification_report(expected,predicted))print(metrics.confusion_matrix(expected,predicted))除了分类和回归问题,Scikit-Learn还有大量更复杂的算法,包括聚类,构建混合algorithmsBagging和Boosting等实现技术。如何优化算法的参数在编写高效算法的过程中,最困难的步骤之一就是选择正确的参数。一般来说,如果你有经验的话会更容易,但我们还是得看看。幸运的是,Scikit-Learn提供了许多函数来帮助解决这个问题。举个例子,我们看一下正则化参数的选择,其中有很多值被依次搜索:array([1,0.1,0.01,0.001,0.0001,0])#创建并拟合岭回归模型,测试每个alphamodel=Ridge()grid=GridSearchCV(estimator=model,param_grid=dict(alpha=alphas))grid.fit(X,y)print(grid)#总结网格搜索的结果print(grid.best_score_)print(grid.best_estimator_.alpha)有时从给定的范围内随机选择一个参数会更高效,估计在在此参数下算法的质量,然后选择最好的。importnumpyasnpfromscipy.statsimportuniformassp_randfromsklearn.linear_modelimportRidgefromsklearn.grid_searchimportRandomizedSearchCV#为alpha参数准备一个均匀分布样本param_grid={'alpha':sp_randelridgeandresmodel()}#,测试随机alphavaluesmodel=Ridge()rsearch=RandomizedSearchCV(estimator=model,param_distributions=param_grid,n_iter=100)rsearch.fit(X,y)print(rsearch)#总结随机参数search的结果print(rsearch.best_score_)print(rsearch.best_estimator_.alpha)到目前为止,我们已经了解了使用Scikit-Learn库的整个过程,除了将结果输出到文件之外。将此作为练习留给你,Python相对于R的一大优势是它有很好的文档。在下一篇文章中,我们将深入探讨其他问题。特别是,我们想谈一谈非常重要的事情——特征的构建。我真的希望这份材料能帮助新手数据科学家尽快开始解决实际的机器学习问题。***,祝刚开始参加机器学习比赛的小伙伴们耐心等待,取得成功!
