python可以实现哪些功能_Python中实现机器学习功能的四种方法介绍

本篇文章给大家带来的内容是关于Python中实现机器学习功能的四种方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

在本文中,我们将介绍从数据集中选择要素的不同方法; 并使用Scikit-learn(sklearn)库讨论特征选择算法的类型及其在Python中的实现 :单变量特征选择

递归特征消除(RFE)

主成分分析(PCA)

特征选择 (feature importance)

单变量特征选择

统计测试可用于选择与输出变量具有最强关系的那些特征。

scikit-learn库提供SelectKBest类,可以与一组不同的统计测试一起使用,以选择特定数量的功能。

以下示例使用chi平方(chi ^ 2)统计检验非负特征来选择Pima Indians糖尿病数据集中的四个最佳特征:#Feature Extraction with Univariate Statistical Tests (Chi-squared for classification)

#Import the required packages

#Import pandas to read csv import pandas

#Import numpy for array related operations import numpy

#Import sklearn's feature selection algorithm

from sklearn.feature_selection import SelectKBest

#Import chi2 for performing chi square test from sklearn.feature_selection import chi2

#URL for loading the dataset

url ="https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians diabetes/pima-indians-diabetes.data"

#Define the attribute names

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

#Create pandas data frame by loading the data from URL

dataframe = pandas.read_csv(url, names=names)

#Create array from data values

array = dataframe.values

#Split the data into input and target

X = array[:,0:8]

Y = array[:,8]

#We will select the features using chi square

test = SelectKBest(score_func=chi2, k=4)

#Fit the function for ranking the features by score

fit = test.fit(X, Y)

#Summarize scores numpy.set_printoptions(precision=3) print(fit.scores_)

#Apply the transformation on to dataset

features = fit.transform(X)

#Summarize selected features print(features[0:5,:])

每个属性的分数和所选的四个属性(分数最高的分数):plas,test,mass和age。

每个功能的分数:[111.52 1411.887 17.605 53.108 2175.565 127.669 5.393

181.304]

特色:[[148. 0. 33.6 50. ]

[85. 0. 26.6 31. ]

[183. 0. 23.3 32. ]

[89. 94. 28.1 21. ]

[137. 168. 43.1 33. ]]

递归特征消除(RFE)

RFE通过递归删除属性并在剩余的属性上构建模型来工作。它使用模型精度来识别哪些属性(和属性组合)对预测目标属性的贡献最大。以下示例使用RFE和逻辑回归算法来选择前三个特征。算法的选择并不重要,只要它技巧性和一致性:#Import the required packages

#Import pandas to read csv import pandas

#Import numpy for array related operations import numpy

#Import sklearn's feature selection algorithm from sklearn.feature_selection import RFE

#Import LogisticRegression for performing chi square test from sklearn.linear_model import LogisticRegression

#URL for loading the dataset

url =

"https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-dia betes/pima-indians-diabetes.data"

#Define the attribute names

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

#Create pandas data frame by loading the data from URL

dataframe = pandas.read_csv(url, names=names)

#Create array from data values

array = dataframe.values

#Split the data into input and target

X = array[:,0:8]

Y = array[:,8]

#Feature extraction

model = LogisticRegression() rfe = RFE(model, 3)

fit = rfe.fit(X, Y)

print("Num Features: %d"% fit.n_features_) print("Selected Features: %s"% fit.support_) print("Feature Ranking: %s"% fit.ranking_)

执行后,我们将获得:Num Features: 3

Selected Features: [ True False False False False True True False]

Feature Ranking: [1 2 3 5 6 1 1 4]

您可以看到RFE选择了前三个功能,如preg,mass和pedi。这些在support_数组中标记为True,并在ranking_数组中标记为选项1。

主成分分析(PCA)

PCA使用线性代数将数据集转换为压缩形式。通常,它被认为是数据简化技术。PCA的一个属性是您可以选择转换结果中的维数或主成分数。

在以下示例中,我们使用PCA并选择三个主要组件:#Import the required packages

#Import pandas to read csv import pandas

#Import numpy for array related operations import numpy

#Import sklearn's PCA algorithm

from sklearn.decomposition import PCA

#URL for loading the dataset

url =

"https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians diabetes/pima-indians-diabetes.data"

#Define the attribute names

names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']

dataframe = pandas.read_csv(url, names=names)

#Create array from data values

array = dataframe.values

#Split the data into input and target

X = array[:,0:8]

Y = array[:,8]

#Feature extraction

pca = PCA(n_components=3) fit = pca.fit(X)

#Summarize components

print("Explained Variance: %s") % fit.explained_variance_ratio_

print(fit.components_)

您可以看到转换后的数据集(三个主要组件)与源数据几乎没有相似之处:Explained Variance: [ 0.88854663 0.06159078 0.02579012]

[[ -2.02176587e-03 9.78115765e-02 1.60930503e-02 6.07566861e-02

9.93110844e-01 1.40108085e-02 5.37167919e-04 -3.56474430e-03]

[ -2.26488861e-02 -9.72210040e-01 -1.41909330e-01 5.78614699e-02 9.46266913e-02 -4.69729766e-02 -8.16804621e-04 -1.40168181e-01

[ -2.24649003e-02 1.43428710e-01 -9.22467192e-01 -3.07013055e-01 2.09773019e-02 -1.32444542e-01 -6.39983017e-04 -1.25454310e-01]]

特征选择 (feature importance)

特征重要性是用于使用训练有监督的分类器来选择特征的技术。当我们训练分类器(例如决策树)时,我们会评估每个属性以创建分裂; 我们可以将此度量用作特征选择器。让我们详细了解它。

随机森林是最受欢迎的 机器学习方法之一,因为它们具有相对较好的准确性,稳健性和易用性。它们还提供了两种直接的特征选择方法 - 平均降低杂质和平均降低精度。

随机森林由许多决策树组成。决策树中的每个节点都是单个要素上的条件,旨在将数据集拆分为两个,以便类似的响应值最终出现在同一个集合中。选择(局部)最佳条件的度量称为杂质。对于分类,它通常是基尼系数

杂质或信息增益/熵,对于回归树,它是方差。因此,当训练树时,可以通过每个特征减少树中的加权杂质的程度来计算它。对于森林,可以对每个特征的杂质减少进行平均,并且根据该度量对特征进行排序。

让我们看看如何使用随机森林分类器进行特征选择,并评估特征选择前后分类器的准确性。我们将使用Otto数据集。

该数据集描述了超过61,000种产品的93个模糊细节,这些产品分为10个产品类别(例如,时装,电子产品等)。输入属性是某种不同事件的计数。

目标是将新产品的预测作为10个类别中每个类别的概率数组,并使用多类对数损失(也称为交叉熵)来评估模型。

我们将从导入所有库开始:#Import the supporting libraries

#Import pandas to load the dataset from csv file

from pandas import read_csv

#Import numpy for array based operations and calculations

import numpy as np

#Import Random Forest classifier class from sklearn

from sklearn.ensemble import RandomForestClassifier

#Import feature selector class select model of sklearn

from sklearn.feature_selection

import SelectFromModel

np.random.seed(1)

让我们定义一种方法将数据集拆分为训练和测试数据; 我们将在训练部分训练我们的数据集,测试部分将用于评估训练模型:#Function to create Train and Test set from the original dataset def getTrainTestData(dataset,split):

np.random.seed(0) training = [] testing = []

np.random.shuffle(dataset) shape = np.shape(dataset)

trainlength = np.uint16(np.floor(split*shape[0]))

for i in range(trainlength): training.append(dataset[i])

for i in range(trainlength,shape[0]): testing.append(dataset[i])

training = np.array(training) testing = np.array(testing)

return training,testing

我们还需要添加一个函数来评估模型的准确性; 它将预测和实际输出作为输入来计算百分比准确度:#Function to evaluate model performance

def getAccuracy(pre,ytest): count = 0

for i in range(len(ytest)):

if ytest[i]==pre[i]: count+=1

acc = float(count)/len(ytest)

return acc

这是加载数据集的时间。我们将加载train.csv文件; 此文件包含超过61,000个训练实例。我们将在我们的示例中使用50000个实例,其中我们将使用35,000个实例来训练分类器,并使用15,000个实例来测试分类器的性能:#Load dataset as pandas data frame

data = read_csv('train.csv')

#Extract attribute names from the data frame

feat = data.keys()

feat_labels = feat.get_values()

#Extract data values from the data frame

dataset = data.values

#Shuffle the dataset

np.random.shuffle(dataset)

#We will select 50000 instances to train the classifier

inst = 50000

#Extract 50000 instances from the dataset

dataset = dataset[0:inst,:]

#Create Training and Testing data for performance evaluation

train,test = getTrainTestData(dataset, 0.7)

#Split data into input and output variable with selected features

Xtrain = train[:,0:94] ytrain = train[:,94] shape = np.shape(Xtrain)

print("Shape of the dataset ",shape)

#Print the size of Data in MBs

print("Size of Data set before feature selection: %.2f MB"%(Xtrain.nbytes/1e6))

我们在这里注意数据大小; 因为我们的数据集包含大约35000个具有94个属性的训练实例; 我们的数据集的大小非常大。让我们来看看:Shape of the dataset (35000, 94)

Size of Data set before feature selection: 26.32 MB

如您所见,我们的数据集中有35000行和94列,超过26 MB数据。

在下一个代码块中,我们将配置随机林分类器; 我们将使用250棵树,最大深度为30,随机要素的数量为7.其他超参数将是sklearn的默认值:#Lets select the test data for model evaluation purpose

Xtest = test[:,0:94] ytest = test[:,94]

#Create a random forest classifier with the following Parameters

trees = 250

max_feat = 7

max_depth = 30

min_sample = 2

clf = RandomForestClassifier(n_estimators=trees,

max_features=max_feat,

max_depth=max_depth,

min_samples_split= min_sample, random_state=0,

n_jobs=-1)

#Train the classifier and calculate the training time

import time

start = time.time() clf.fit(Xtrain, ytrain) end = time.time()

#Lets Note down the model training time

print("Execution time for building the Tree is: %f"%(float(end)- float(start)))

pre = clf.predict(Xtest)

Let's see how much time is required to train the model on the training dataset:

Execution time for building the Tree is: 2.913641

#Evaluate the model performance for the test data

acc = getAccuracy(pre, ytest)

print("Accuracy of model before feature selection is %.2f"%(100*acc))

我们模型的准确性是:

特征选择前的模型精度为98.82

正如您所看到的,我们正在获得非常好的准确性,因为我们将近99%的测试数据分类到正确的类别中。这意味着我们正在对15,000个正确类中的14,823个实例进行分类。

那么,现在我的问题是:我们是否应该进一步改进?好吧,为什么不呢?如果可以的话,我们肯定会寻求更多的改进; 在这里,我们将使用功能重要性来选择功能。如您所知,在树木构建过程中,我们使用杂质测量来选择节点。选择具有最低杂质的属性值作为树中的节点。我们可以使用类似的标准进行特征选择。我们可以更加重视杂质较少的功能,这可以使用sklearn库的feature_importances_函数来完成。让我们找出每个功能的重要性:

#Once我们培养的模型中,我们的排名将所有功能的功能在拉链(feat_labels,clf.feature_importances_):print(feature)

('id', 0.33346650420175183)

('feat_1', 0.0036186958628801214)

('feat_2', 0.0037243050888530957)

('feat_3', 0.011579217472062748)

('feat_4', 0.010297382675187445)

('feat_5', 0.0010359139416194116)

('feat_6', 0.00038171336038056165)

('feat_7', 0.0024867672489765021)

('feat_8', 0.0096689721610546085)

('feat_9', 0.007906150362995093)

('feat_10', 0.0022342480802130366)

正如您在此处所看到的,每个要素都基于其对最终预测的贡献而具有不同的重要性。

我们将使用这些重要性分数来排列我们的功能; 在下面的部分中,我们将选择功能重要性大于0.01的模型训练功能:#Select features which have higher contribution in the final prediction

sfm = SelectFromModel(clf, threshold=0.01) sfm.fit(Xtrain,ytrain)

在这里,我们将根据所选的特征属性转换输入数据集。在下一个代码块中,我们将转换数据集。然后,我们将检查新数据集的大小和形状:#Transform input dataset

Xtrain_1 = sfm.transform(Xtrain) Xtest_1 = sfm.transform(Xtest)

#Let's see the size and shape of new dataset print("Size of Data set before feature selection: %.2f MB"%(Xtrain_1.nbytes/1e6))

shape = np.shape(Xtrain_1)

print("Shape of the dataset ",shape)

Size of Data set before feature selection: 5.60 MB Shape of the dataset (35000, 20)

你看到数据集的形状了吗?在功能选择过程之后,我们只剩下20个功能,这将数据库的大小从26 MB减少到5.60 MB。这比原始数据集减少了约80%。

在下一个代码块中,我们将训练一个新的随机森林分类器,它具有与之前相同的超参数,并在测试数据集上进行测试。让我们看看修改训练集后得到的准确度:#Model training time

start = time.time() clf.fit(Xtrain_1, ytrain) end = time.time()

print("Execution time for building the Tree is: %f"%(float(end)- float(start)))

#Let's evaluate the model on test data

pre = clf.predict(Xtest_1) count = 0

acc2 = getAccuracy(pre, ytest)

print("Accuracy after feature selection %.2f"%(100*acc2))

Execution time for building the Tree is: 1.711518 Accuracy after feature selection 99.97

你能看到!! 我们使用修改后的数据集获得了99.97%的准确率,这意味着我们在正确的类中对14,996个实例进行了分类,而之前我们只正确地对14,823个实例进行了分类。

这是我们在功能选择过程中取得的巨大进步; 我们可以总结下表中的所有结果:评估标准在选择特征之前选择功能后功能数量9420

数据集的大小26.32 MB5.60 MB

训练时间2.91秒1.71秒

准确性98.82%99.97%

上表显示了特征选择的实际优点。您可以看到我们显着减少了要素数量,从而降低了数据集的模型复杂性和维度。尺寸减小后我们的训练时间缩短,最后,我们克服了过度拟合问题,获得了比以前更高的精度。

以上就是Python中实现机器学习功能的四种方法介绍的详细内容,更多请关注php中文网其它相关文章!

article_wechat2021.jpg?1111

本文转载于:segmentfault,如有侵犯,请联系a@php.cn删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nature子刊批判人工神经网络:先天结构比后天训练更重要,应该借鉴动物大脑...

来源:凹非寺人工神经网络可以从动物大脑中学到什么?最新一期Nature子刊上,就刊登了这样一篇文章。美国冷泉港实验室的神经科学家Anthony M. Zador,对当下人工神经网络的研究思路进行了深刻反思与批判:大多数动物行为不…

C++初始化vector<vector<int>>

假设dps是一个mn维的vector&#xff0c;则初始化dps为全零的方法为&#xff1a; vector<vector<int>> dps(m, vector<int>(n,0));

matlab的傅里叶变换

更多MATLAB图像处理视频请点击 http://study.163.com/course/courseMain.htm?courseId1003594013 图像变换&#xff1a; 更多MATLAB图像处理视频请点击 http://study.163.com/course/courseMain.htm?courseId1003594013 在 MATLAB 中&#xff0c;一般用二元函数…

python在另一个函数中使用其他函数的变量_在另一个函数中访问函数的变量,如function() . var in python...

我在寻找一种正确的方法来访问另一个函数中的函数变量时遇到了一些问题 . 我正在制作远程操作类工具&#xff0c;因此我需要处理接收的命令[如exit或nircmdc.exe或telnet等] . 下面的代码不完整&#xff0c;但它是核心&#xff1a; def regular(): global data datac.recv(1024…

笔记一 Redis基础

在cmd 命令中运行redis 运行redis命令 &#xff1a;redis-cli Reids数据结构初探 数据结构有五种 string(字符串)、 list(列表)、set&#xff08;集合&#xff09;、hash&#xff08;散列&#xff09;、zset(有序集合) redis各类型的简单介绍 和最基础的命令 1.string&a…

C++获取指向二维数组的首元素指针

假设一个二维数组int a[][4] { { 3, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };&#xff0c;获取指向其首个元素&#xff08;即3&#xff09;的指针方法为&#xff1a; int*pa[0]&a[0][0]*a; 说明&#xff1a; &#xff08;1&#xff09;二维…

matlab的四维图像数据可视化

1.颜色来表示第四维 前面已经学了三维图形可视化&#xff0c;所谓三维就是指x轴&#xff0c;y轴&#xff0c;z轴组成了我们的三维&#xff0c;那么第四维用什么来表示呢&#xff0c;我们这里要用颜色来表示第四维&#xff0c;所谓四维图形可视化就是在三维图形可视化的基础上&…

Mybatis 入门之resultMap与resultType讲解实例

resultMap&#xff1a;适合使用返回值是自定义实体类的情况 resultType&#xff1a;适合使用返回值得数据类型是非自定义的&#xff0c;即jdk的提供的类型 resultMap &#xff1a; type&#xff1a;映射实体类的数据类型 id&#xff1a;resultMap的唯一标识 column:库表的字段…

全球半导体产业60年兴衰启示录!

本文来自华泰证券&#xff0c;研究员张馨元、钱海、陈莉敏&#xff0c;感谢分享&#xff01;科技是当前行业配置不能忽视的主线&#xff0c;我们在今年 5 月 10 日发布的中期策略报告《无科技不牛市&#xff0c;以时间换空间》中提出&#xff0c;5G 时代物联网技术革命带来的是…

手机上python编程工具3和3h有区别吗_Python3.5内置模块之time与datetime模块用法实例分析...

本文实例讲述了Python3.5内置模块之time与datetime模块用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1、模块的分类 a、标准库&#xff08;Python自带&#xff09;&#xff1a;sys、os模块 b、开源模块&#xff08;第三方模块&#xff09; c、自定义模块 2、内…

c++ string后面会添加‘\0‘

string类后面会添加\0&#xff0c;但这个\0不算入length里面 以一个例子就能说明&#xff1a; int main() {string s "hhh";cout << (s[3] \0)<<endl;cout << s.length() << endl;return 0; } 输出&#xff1a; 1 3

在visual studio code中配置python以及解决中文乱码问题

安装好 visual stuido code &#xff08;下面简称 “ VSC ”&#xff09;后&#xff0c;要想使用它运行调试 python 代码还需要做一些工作以解决下列问题&#xff1a; 搭建 python 环境print 打印中文出现乱码一、搭建 python 环境 在 VSC 中点击 F1 键&#xff0c;弹出控制台&…

华为加码布局 VR/AR趁势启航

来源&#xff1a;VR每日必看乘5G东风&#xff0c;VR/AR空间打开。随着5G的到来&#xff0c;5G高速和超低时延的特性将完美应对VR/AR发展的短板&#xff0c;商用牌照的发放将带领5G逐渐进入放量阶段&#xff0c;内外巨头均已开始大力布局。分析人士认为&#xff1a;第一阶段场景…

linux系列之常用运维命令整理笔录

本博客记录工作中需要的linux运维命令&#xff0c;大学时候开始接触linux&#xff0c;会一些基本操作&#xff0c;可是都没有整理起来&#xff0c;加上是做开发&#xff0c;不做运维&#xff0c;有些命令忘记了&#xff0c;所以现在整理成博客&#xff0c;当然vi&#xff0c;文…

C++ 传递字符串数组给函数参数

C 传数组给一个函数&#xff0c;数组类型自动转换为指针类型&#xff0c;因而传的实际是地址。 对于传入字符串数组同理&#xff0c;所以如果在函数中对传入的字符串数组进行改变&#xff0c;函数外的字符串数组也会同时改变 举个简单的例子&#xff1a; void change(char s…

Android高德地图自定义Markers的例子

下文为各位重点介绍关于Android高德地图自定义Markers的例子&#xff0c;希望这篇文章能够让各位理解到Android高德地图自定义Markers的方法。 之前的博客里说了地图的嵌入和定位&#xff0c;今天就说说在地图上显示一些我们想要的。在地图中有自带的Markers&#xff08;标记&a…

javaweb教务管理系统_基于Java web的教务管理系统

源码编号&#xff1a;B-E00033 点击查看(分类规则)项目类型&#xff1a;Java EE项目(非开源)项目名称&#xff1a;基于Java web的教务管理系统(TeachingSystem)当前版本&#xff1a;V1.0.1版本难度等级&#xff1a;✩✩复杂程度&#xff1a;✩✩ 点击查看难度等级用户类型&…

Science揭秘:为什么“好记性不如烂笔头”?

来源&#xff1a;中国生物技术网你还能记起你小学班长的名字吗&#xff1f;但我相信你肯定能记得同桌的名字&#xff0c;和与其共同经历的种种。但要再问你昨天新来同事的名字&#xff0c;你是否可以不假思索的回答出来&#xff1f;是不是有点儿困难&#xff1f;那为什么你能脱…

十个不可不看的Matlab GUI

截止到2012年6月2日&#xff0c;MatlabCentral上一共有1743个与"gui"有关的program。经过浏览前800个&#xff0c;选出以下比较有趣的程序。其中大部分没有经过测试&#xff0c;有可能无法使用或者功能不够理想&#xff0c;但至少可以作为一个starting point 吧。 Al…

C++链表插入节点函数为什么要传递头节点的二维指针

C链表插入一个节点的代码如下&#xff1a; struct ListNode {int m_value;ListNode * m_next; };void addListNode(ListNode** pHead, int value) {ListNode * pNew new ListNode();pNew->m_value value;pNew->m_next NULL;if (*pHead NULL){*pHead pNew;}else{Lis…