本文目录一览:
如何用python实现随机森林分类
大家如何使用scikit-learn包中的类方法来进行随机森林算法的预测。其中讲的比较好的是各个参数的具体用途。
这里我给出我的理解和部分翻译:
参数说明:
最主要的两个参数是n_estimators和max_features。
n_estimators:表示森林里树的个数。理论上是越大越好。但是伴随着就是计算时间的增长。但是并不是取得越大就会越好,预测效果最好的将会出现在合理的树个数。
max_features:随机选择特征集合的子集合,并用来分割节点。子集合的个数越少,方差就会减少的越快,但同时偏差就会增加的越快。根据较好的实践经验。如果是回归问题则:
max_features=n_features,如果是分类问题则max_features=sqrt(n_features)。
如果想获取较好的结果,必须将max_depth=None,同时min_sample_split=1。
同时还要记得进行cross_validated(交叉验证),除此之外记得在random forest中,bootstrap=True。但在extra-trees中,bootstrap=False。
这里也给出一篇老外写的文章:调整你的随机森林模型参数
这里我使用了scikit-learn自带的iris数据来进行随机森林的预测:
[python] view plain copy
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
import numpy as np
from sklearn.datasets import load_iris
iris=load_iris()
#print iris#iris的4个属性是:萼片宽度 萼片长度 花瓣宽度 花瓣长度 标签是花的种类:setosa versicolour virginica
print iris['target'].shape
rf=RandomForestRegressor()#这里使用了默认的参数设置
rf.fit(iris.data[:150],iris.target[:150])#进行模型的训练
#
#随机挑选两个预测不相同的样本
instance=iris.data[[100,109]]
print instance
print 'instance 0 prediction;',rf.predict(instance[0])
print 'instance 1 prediction;',rf.predict(instance[1])
print iris.target[100],iris.target[109]
返回的结果如下:
(150,)
[[ 6.3 3.3 6. 2.5]
[ 7.2 3.6 6.1 2.5]]
instance 0 prediction; [ 2.]
instance 1 prediction; [ 2.]
2 2
在这里我有点困惑,就是在scikit-learn算法包中随机森林实际上就是一颗颗决策树组成的。但是之前我写的决策树博客中是可以将决策树给显示出来。但是随机森林却做了黑盒处理。我们不知道内部的决策树结构,甚至连父节点的选择特征都不知道是谁。所以我给出下面的代码(这代码不是我的原创),可以显示的显示出所有的特征的贡献。所以对于贡献不大的,甚至是负贡献的我们可以考虑删除这一列的特征值,避免做无用的分类。
[python] view plain copy
from sklearn.cross_validation import cross_val_score, ShuffleSplit
X = iris["data"]
Y = iris["target"]
names = iris["feature_names"]
rf = RandomForestRegressor()
scores = []
for i in range(X.shape[1]):
score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
cv=ShuffleSplit(len(X), 3, .3))
scores.append((round(np.mean(score), 3), names[i]))
print sorted(scores, reverse=True)
显示的结果如下:
[(0.934, 'petal width (cm)'), (0.929, 'petal length (cm)'), (0.597, 'sepal length (cm)'), (0.276, 'sepal width (cm)')]
这里我们会发现petal width、petal length这两个特征将起到绝对的贡献,之后是sepal length,影响最小的是sepal width。这段代码将会提示我们各个特征的贡献,可以让我们知道部分内部的结构。
python标准类型的分类?
如果让我们描述标准类型,我们也许会称它们是Python的“基本内建数据对象原始类型"。“基本”是指这些类型都是Python提供的标准或核心类型。“内建”是由于这些类型是Python默认就提供的。“数据”是因为他们用于一般数据存储。“对象”是因为对象是数据和功能的默认抽象。“原始”是因为这些类型提供的是最底层的粒度数据存储。“类型”是因为他们就是数据类型。不过,上面这些描述实际上并没有告诉你每个类型如何工作,以及它们能发挥什么作用。事实上,几个类型共享某一些的特性,比如功能的实现手段,另一些类型则在访问数据值方面有一些共同之处。我们感兴趣的还有这些类型的数据如何更新,以及它们能提供什么样的存储。有3种不同的模型可以帮助我们对基本类型进行分类,每种模型都展示给我们这些类型之间的相互关系。这些模型可以帮助我们更好的理解类型之间的相互关系以及他们的工作原理。
python对数据进行聚类怎么显示数据分类
将其整理成数据集为:
[ [1,0,"yes"],[1,1,"yes"],[0,1,"yes"],[0,0,"no"],[1,0,"no"] ]
算法过程:
1、计算原始的信息熵。
2、依次计算数据集中每个样本的每个特征的信息熵。
3、比较不同特征信息熵的大小,选出信息熵最大的特征值并输出。
运行结果:
col : 0 curInfoGain : 2.37744375108 baseInfoGain : 0.0
col : 1 curInfoGain : 1.37744375108 baseInfoGain : 2.37744375108
bestInfoGain : 2.37744375108 bestFeature: 0
结果分析:
说明按照第一列,即有无喉结这个特征来进行分类的效果更好。
思考:
1、能否利用决策树算法,将样本最终的分类结果进行输出?如样本1,2,3属于男性,4属于女性。
2、示例程序生成的决策树只有一层,当特征量增多的时候,如何生成具有多层结构的决策树?
3、如何评判分类结果的好坏?
在下一篇文章中,我将主要对以上三个问题进行分析和解答。如果您也感兴趣,欢迎您订阅我的文章,也可以在下方进行评论,如果有疑问或认为不对的地方,您也可以留言,我将积极与您进行解答。
完整代码如下:
from math import log
"""
计算信息熵
"""
def calcEntropy(dataset):
diclabel = {} ## 标签字典,用于记录每个分类标签出现的次数
for record in dataset:
label = record[-1]
if label not in diclabel.keys():
diclabel[label] = 0
diclabel[label] += 1
### 计算熵
entropy = 0.0
cnt = len(dataset)
for label in diclabel.keys():
prob = float(1.0 * diclabel[label]/cnt)
entropy -= prob * log(prob,2)
return entropy
def initDataSet():
dataset = [[1,0,"yes"],[1,1,"yes"],[0,1,"yes"],[0,0,"no"],[1,0,"no"]]
label = ["male","female"]
return dataset,label
#### 拆分dataset ,根据指定的过滤选项值,去掉指定的列形成一个新的数据集
def splitDataset(dataset , col, value):
retset = [] ## 拆分后的数据集
for record in dataset:
if record[col] == value :
reducedFeatVec = record[:col]
reducedFeatVec.extend(record[col+1:]) ### 将指定的列剔除
retset.append(reducedFeatVec) ### 将新形成的特征值列表追加到返回的列表中
return retset
### 找出信息熵增益最大的特征值
### 参数:
### dataset : 原始的数据集
def findBestFeature(dataset):
numFeatures = len(dataset[0]) - 1 ### 特征值的个数
baseEntropy = calcEntropy(dataset) ### 计算原始数据集的熵
baseInfoGain = 0.0 ### 初始信息增益
bestFeature = -1 ### 初始的最优分类特征值索引
### 计算每个特征值的熵
for col in range(numFeatures):
features = [record[col] for record in dataset] ### 提取每一列的特征向量 如此处col= 0 ,则features = [1,1,0,0]
uniqueFeat = set(features)
curInfoGain = 0 ### 根据每一列进行拆分,所获得的信息增益
for featVal in uniqueFeat:
subDataset = splitDataset(dataset,col,featVal) ### 根据col列的featVal特征值来对数据集进行划分
prob = 1.0 * len(subDataset)/numFeatures ### 计算子特征数据集所占比例
curInfoGain += prob * calcEntropy(subDataset) ### 计算col列的特征值featVal所产生的信息增益
# print "col : " ,col , " featVal : " , featVal , " curInfoGain :" ,curInfoGain ," baseInfoGain : " ,baseInfoGain
print "col : " ,col , " curInfoGain :" ,curInfoGain ," baseInfoGain : " ,baseInfoGain
if curInfoGain baseInfoGain:
baseInfoGain = curInfoGain
bestFeature = col
return baseInfoGain,bestFeature ### 输出最大的信息增益,以获得该增益的列
dataset,label = initDataSet()
infogain , bestFeature = findBestFeature(dataset)
print "bestInfoGain :" , infogain, " bestFeature:",bestFeature
python怎样把一级分类下面的多级分类都给遍历出来
废话不多说。首先要实现这个,具体思路是:
1.给定父文件夹路径,找出该文件夹中所有的内容(文件夹或文件)。
2.筛选出内容中的文件夹。
总的来说,实现还是挺简单的,python的os包也提供了许多方法。具体看代码
[python] view plain copy
# -*- coding: UTF-8 -*-
import os.path
#定义一个函数,path为你的路径
def traversalDir_FirstDir(path):
#定义一个列表,用来存储结果
list = []
#判断路径是否存在
if (os.path.exists(path)):
#获取该目录下的所有文件或文件夹目录
files = os.listdir(path)
for file in files:
#得到该文件下所有目录的路径
m = os.path.join(path,file)
#判断该路径下是否是文件夹
if (os.path.isdir(m)):
h = os.path.split(m)
print h[1]
list.append(h[1])
print list
traversalDir_FirstDir("E:\\xlrd-1.0.0")
输出结果为:
[plain] view plain copy
build
dist
scripts
tests
xlrd
xlrd.egg-info
['build', 'dist', 'scripts', 'tests', 'xlrd', 'xlrd.egg-info']
Python有一个方法是os.path.isdir(pyth),即判断该路径下的文件下是否是文件夹,其传入的参数的参数是路径,我在想,Python要是提供一个方法,返回该文件下的所有文件路径就好,但貌似我没有找到。所以用了os.listdir(pyth),得到了路径下的所有内容名,然后又用了join()方法把其转化成路径~,额,有些麻烦了。其中split()会把路径截成一个二元组(路径,文件名)
其实有个方法,os.walk()方法可以得到该文件夹下所有文件夹和文件,但我只要求得到子一级文件夹哈。具体可参考旁边链接:点击打开链接。
下面再附上Python的 os的一些属性方法:os模块方法
因之前我学过一些Java,所以感觉Python语法跟Java差不多,不过比Java更加简练
额,发现一个函数,glob()方法可以直接得到一个文件夹下所有的路径。上面的代码可以改进如下:
[python] view plain copy
# -*- coding: UTF-8 -*-
import glob
import os.path
def traversalDir_FirstDir(path):
list = []
if (os.path.exists(path)):
#获取该目录下的所有文件或文件夹目录路径
files = glob.glob(path + '\\*' )
print files
for file in files:
#判断该路径下是否是文件夹
if (os.path.isdir(file)):
#分成路径和文件的二元元组
h = os.path.split(file)
print h[1]
list.append(h[1])
print list
traversalDir_FirstDir("E:\\xlrd-1.0.0")