"""
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
Ads help maintain this website.