機器學習一:使用決策樹和隨機森林對資料分類
首先匯入資料:income_classification.csv
在python編輯器中匯入所需要的庫
import numpy as np
import pandas as pd
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction import DictVectorizer
from sklearn.preprocessing import LabelEncoder
題目一:讀入資料并顯示資料的維度和前5行資料,
#題目一:讀入資料并顯示資料的維度和前五行資料
print('1.載入資料.....')
data = pd.read_csv("income_classification.csv", header=0)
print('資料的維度和前五行資料:', data.shape)
print(data.head())
題目二:對連續變數age進行離散化處理并顯示前五行,
print('對連續變數age進行離散化處理,等寬分成五類,顯示前五行:')
AGE_CUT = pd.cut(x=data['age'], bins=5, labels=range(0, 5))
data['age'] = AGE_CUT
print(data.head(5))
題目三:對屬性是字串的任意特征進行數字編號處理,顯示前5行編碼后的結果,每個特定的字串用一個整數來表示,整數序列從0開始增長,
class_le = LabelEncoder()
data['workclass'] = pd.DataFrame(class_le.fit_transform(data['workclass']))
data['marital-status'] = pd.DataFrame(class_le.fit_transform(data['marital-status']))
data['occupation'] = pd.DataFrame(class_le.fit_transform(data['occupation']))
data['education'] = pd.DataFrame(class_le.fit_transform(data['education']))
data['native-country'] = pd.DataFrame(class_le.fit_transform(data['native-country']))
data['relationship'] = pd.DataFrame(class_le.fit_transform(data['relationship']))
data['race'] = pd.DataFrame(class_le.fit_transform(data['race']))
data['sex'] = pd.DataFrame(class_le.fit_transform(data['sex']))
print('顯示前五行編碼后的結果:')
print(data.head(5))
題目四:對預處理后的資料用決策樹演算法和隨機森林演算法分類,
實驗步驟
- 選擇合適的若干特征欄位
- 按7:3劃分訓練集和樣本集
- 使用訓練集訓練一個決策樹分類器
- 使用測驗集計算決策樹分類器的分類準確率
- 使用訓練集訓練一個隨機森林分類器
- 使用測驗集計算隨機森林分類器的分類準確率
data1 = []
labels = []
for index, row in data.iterrows():
# data需要是字典形式,因為之后需要使用DictVectorizer()修改字串資料型別,以便符合DecisionTreeClassifier()
rowDict = {}
row = list(row)
rowDict['age'] = row[0]
rowDict['workclass'] = row[1]
rowDict['education'] = row[2]
rowDict['education_num'] = row[3]
rowDict['maritial_status'] = row[4]
rowDict['occupation'] = row[5]
rowDict['relationship'] = row[6]
rowDict['race'] = row[7]
rowDict['sex'] = row[8]
rowDict['capital_gain'] = row[9]
rowDict['capital_loss'] = row[10]
rowDict['hours_per_week'] = row[11]
rowDict['native_country'] = row[12]
data1.append(rowDict)
labels.append(row[-1])
print('2. 構造資料和標簽.....')
x = np.array(data1)
labels = np.array(labels)
y = np.zeros(labels.shape) # 初始label全為0
y[labels == '<=50K'] = 0 # 當label等于這三種屬性的話,設定為1,
y[labels == '>50K'] = 1
# 轉換字串資料型別
print('3.轉換字串資料型別.....')
vec = DictVectorizer()
dx = vec.fit_transform(x).toarray()
# 拆分成訓練資料和測驗資料
print('4.拆分訓練資料和測驗資料.....')
print('訓練集和驗證集比例7:3')
ratio = 0.7
xTrain = []
yTrain = []
xTest = []
yTest = []
features = xTrain, xTest
labels = yTrain, yTest
for i in range(len(dx)):
dataSetIndex = 0 if np.random.random() < ratio else 1
features[dataSetIndex].append(dx[i])
labels[dataSetIndex].append(y[i])
# CART決策樹分類
print('5.CART決策樹分類.....')
clf_cart = tree.DecisionTreeClassifier(criterion='entropy') # CART演算法,使用entropy作為標準;默認是是用gini作為標準
clf_cart.fit(xTrain, yTrain)
# 檢查準確率
accuracy_cart = clf_cart.score(xTest, yTest)
print('CART樹分類準確率:', accuracy_cart)
print('6.隨機森林分類.....')
clf_random = RandomForestClassifier()
clf_random.fit(xTrain, yTrain)
# 檢查準確率
accuracy_random = clf_random.score(xTest, yTest)
print('隨機森林分類準確率:', accuracy_random)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/352093.html
標籤:AI
