Gradient boosting for data classification using Smile
Code: "classify_gradboost.py". Programming language: Python
DMelt Version 2.2. Last modified: 03/12/2018. License: Pro
https://datamelt.org/code/cache/classify_gradboost_8125.py
To run this script using the DMelt IDE,
copy the above URL link to the menu [File]→[Read script from URL] of the DMelt IDE.
"""
Gradient boosting for classification. Gradient boosting is typically used
with decision trees (especially CART regression trees) of a fixed size as
base learners. For this special case Friedman proposes a modification to
gradient boosting method which improves the quality of fit of each base
learner.
"""
from smile.data import AttributeDataset,NominalAttribute
from smile.data.parser import DelimitedTextParser,IOUtils
from smile.classification import GradientTreeBoost
from smile.math import Math
from smile.sort import QuickSort
from jhplot import *
from java.io import File
from jarray import zeros,array
import java
# this function extract data[][] and label[] array from datasets
def getJavaArrays(dataset):
rows=dataset.size()
lst = [0.0]*rows
twoDimArr = array([lst,[]], java.lang.Class.forName('[D'))
data = dataset.toArray(twoDimArr)
label = dataset.toArray(zeros(rows, "i"))
return data,label
http="http://datamelt.org/examples/data/usps/"
print "Reading data from",http
datasource="zip.train"
datasetName="USPS Train"
print Web.get(http+datasource)
parser =DelimitedTextParser()
parser.setResponseIndex(NominalAttribute("class"), 0)
train=parser.parse(datasetName,File(datasource))
x,y=getJavaArrays(train)
print "Getting test data.."
datasource="zip.test"
datasetName="USPS Test"
print Web.get(http+datasource)
test=parser.parse(datasetName,File(datasource))
testx,testy=getJavaArrays(test)
for i in range(len(y)):
if y[i] != 0: y[i] = 1
for i in range(len(testy)):
if testy[i] != 0: testy[i] = 1
print "Classify.."
boost = GradientTreeBoost(train.attributes(), x, y, 100)
rows=len(testx)
e=0.0
for i in range(rows):
minput=testx[i].tolist()
expected=testy[i]
predicted=boost.predict(testx[i])
if (i%100==0): print " expected=",expected," prediction=",predicted
if (expected != predicted): e=e+1.0
e=e/rows
accuracy = boost.test(testx, testy);
for i in range(len(accuracy )):
print "Tree accuracy=", i, 100.0 * accuracy[i-1]
importance = boost.importance()
index = QuickSort.sort(importance)
for i in range(len(importance)):
print train.attributes()[index[i]], importance[i]
print "GradientTreeBoost error rate=",e
You see the box below because you did not login.