本文目錄一覽:
如何用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”)
原創文章,作者:IMCJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/134976.html