原理:
决策树生成算法: 是递归地生成决策树,它往往分类精细,对训练数据集分类准确,但是对未知数据集却没有那么准确,有比较严重的过拟合问题。因此,为了简化模型的复杂度,使模型的泛化能力更强,需要对已生成的决策树进行剪枝。
集成分类算法: 集成(Ensemble)分类模型综合考量多个分类器的预测结果,从而做出决策。
随机森林分类器用相同的训练数据同时搭建多个独立的分裂模型,然后通过投票的方式,以少数服从多数的原则作出最终分类的决策。在相同的训练数据上同时搭建多棵决策树,每棵决策树会放弃固定的排序算法,随机选取特征。
梯度提升决策树按照一定的次序搭建多个分类模型。模型之间彼此存在依赖关系。后续加入的模型对集成模型的综合性能有所贡献。每棵决策树在生成的过程中都会尽可能降低整体集成模型在训练集上的拟合误差。
代码:
import turtle
import random
import simpleaudio as sa
#15 引入音乐
laser = sa.WaveObject.from_wave_file('E:\coding_data\python\outer_space\laser.wav')
explosion = sa.WaveObject.from_wave_file('E:\coding_data\python\outer_space\explosion.wav')
#3 设置背景
game = turtle.Screen()
game.setup(700, 700)
game.title("太空侵略者")
game.bgpic('E:\coding_data\python\outer_space\pg.gif')
#4 创建玩家
#game.addshape("E:\coding_data\python\outer_space\play.png")
turtle.addshape('E:\coding_data\python\outer_space\play.gif')
player = turtle.Turtle()
player.ht()
player.speed(0)
player.up()
player.shape('E:\coding_data\python\outer_space\play.gif');
player.setpos(0, -300)
player.st()
#5. 玩家动起来
player_step = 15
def go_left():
x = player.xcor()
x = x - player_step
if x 300:
x = 300
player.setx(x)
turtle.listen()
turtle.onkey(go_left, 'Left')
turtle.onkey(go_right, 'Right')
#8. 添加子弹
bomb = turtle.Turtle()
bomb.ht()
bomb.speed(0)
bomb.up()
bomb.shape('triangle')
bomb.color('yellow')
bomb.shapesize(0.5, 0.5)
bomb.seth(90)
#12. 添加分数
score = 0
pen = turtle.Turtle()
pen.color("white")
pen.speed(0)
pen.up()
pen.ht()
pen.setpos(-340, 230)
score_string = "分数:%s" %score
pen.write(score_string, align="left", font=('Arial', 12, 'normal'))
#9. 发射子弹
is_fired = False
def fire():
global is_fired
if is_fired == False:
bomb.setpos(player.xcor(), player.ycor() + 20)
bomb.st()
is_fired = True
laser.play()
turtle.onkey(fire, 'space')
#6. 添加敌人
num = 6
inv_list = []
turtle.addshape('E:\coding_data\python\outer_space\inv.gif');
for i in range(6):
inv = turtle.Turtle()
inv_list.append(inv)
inv.ht()
inv.speed(0)
inv.up()
inv.shape('E:\coding_data\python\outer_space\inv.gif')
x = random.randint(-200, 200)
y = random.randint(100, 200)
inv.setpos(x,y)
inv.st()
#7. 敌人动起来
inv_step = 2
go_back = False
bomb_step = 20
game_over = False
while True:
if game_over:
pen2 = turtle.Turtle()
pen2.color('red')
pen2.ht()
pen2.write('游戏结束', align='center', font=('Arial', 18, 'bold'))
#explosion.play()
break
for inv in inv_list:
x = inv.xcor()
x += inv_step
inv.setx(x)
if x > 300 or x < -300:
go_back = True
if inv.distance(bomb) < 15:
inv.setpos(0, 240)
is_fired = False
bomb.setpos(-350, -350)
bomb.ht()
score += 10
score_string = "分数:%s" %score
pen.clear()
pen.write(score_string, align="left", font=('Arial', 12, 'normal'))
# explosion.play()
if inv.ycor() 250:
is_fired = False
bomb.setpos(-350, -350)
bomb.ht()
**结果分析:**梯度提升决策树和随机森林分类器的准确率远高于单一决策树。集成分类器综合考量多个分类器的预测结果,降低拟合误差,其准确率更高。
结果截图: