<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 新建一个特征
两支球队上场比赛的情况
有时排名靠后的球队反而能战胜排名靠前的。原因有很多。例如，排名靠后的球队某些打法恰好能击中强者的软肋
Step1:  特征数增加后，决策
树处理不当。鉴于此，我们尝试修改算法，看看会不会起作用。数据挖掘有时就是不断尝试新算
法、使用新特征这样一个过程
决策树在训练数据量很大的情况下，能否得到有效的分类模型。我们将
会为决策树添加球队，以检测它是否能整合新增的信息。
虽然决策树能够处理特征值为类别型的数据，但scikit-learn库所实现的决策树算法要求
先对这类特征进行处理。用LabelEncoder转换器就能把字符串类型的球队名转化为整型
Step2:  决策树可以用这些特征值进行训练，但DecisionTreeClassifier仍把它们当作连续型特
征。例如，编号从0到16的17支球队，算法会认为球队1和2相似，而球队4和10不同。但其实这没
意义，对于两支球队而言，它们要么是同一支球队，要么不同，没有中间状态！
为了消除这种和实际情况不一致的现象，我们可以使用OneHotEncoder转换器把这些整数转
换为二进制数字。每个特征用一个二进制数字①来表示。例如，LabelEncoder为芝加哥公牛队分配
的数值是7，那么OneHotEncoder为它分配的二进制数字的第七位就是1，其余队伍的第七位就是0。
每个可能的特征值都这样处理，而数据集会变得很大
Step3:  使用随机森林
<ASSISTANT_TASK:>
Python Code:
last_match_winner = defaultdict(int)
dataset['HomeTeamWonLast'] = 0
for index,row in dataset.iterrows():
    home_team = row['home']
    visitor_team = row['visitor']
    teams = tuple(sorted([home_team,visitor_team]))
    row['HomeTeamWonLast'] = 1 if last_match_winner[teams] == home_team else 0
    dataset.ix[index] = row
    last_match_winner[teams] = home_team if row["HomeWin"] else visitor_team
x_lastWinner = dataset[["HomeTeamWonLast","HomeTeamRanksHigher"]].values
clf = DecisionTreeClassifier(random_state=14)
scores3 = cross_val_score(clf,x_lastWinner,y_true,scoring='accuracy')
print("Accuracy: {0:.1f}%".format(np.mean(scores3) * 100))
Explanation: 新建一个特征
两支球队上场比赛的情况
有时排名靠后的球队反而能战胜排名靠前的。原因有很多。例如，排名靠后的球队某些打法恰好能击中强者的软肋
End of explanation
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
encoding = LabelEncoder()
encoding.fit(dataset['home'].values)
home_teams = encoding.transform(dataset["home"].values)
visitor_teams = encoding.transform(dataset["visitor"].values)
X_teams = np.vstack([home_teams,visitor_teams]).T
Explanation: 特征数增加后，决策
树处理不当。鉴于此，我们尝试修改算法，看看会不会起作用。数据挖掘有时就是不断尝试新算
法、使用新特征这样一个过程
决策树在训练数据量很大的情况下，能否得到有效的分类模型。我们将
会为决策树添加球队，以检测它是否能整合新增的信息。
虽然决策树能够处理特征值为类别型的数据，但scikit-learn库所实现的决策树算法要求
先对这类特征进行处理。用LabelEncoder转换器就能把字符串类型的球队名转化为整型
End of explanation
onehot = OneHotEncoder()
X_teams_expanded = onehot.fit_transform(X_teams).todense()
clf = DecisionTreeClassifier(random_state=14)
scores4 = cross_val_score(clf, X_teams_expanded, y_true,
scoring='accuracy')
print("Accuracy: {0:.1f}%".format(np.mean(scores4) * 100))
Explanation: 决策树可以用这些特征值进行训练，但DecisionTreeClassifier仍把它们当作连续型特
征。例如，编号从0到16的17支球队，算法会认为球队1和2相似，而球队4和10不同。但其实这没
意义，对于两支球队而言，它们要么是同一支球队，要么不同，没有中间状态！
为了消除这种和实际情况不一致的现象，我们可以使用OneHotEncoder转换器把这些整数转
换为二进制数字。每个特征用一个二进制数字①来表示。例如，LabelEncoder为芝加哥公牛队分配
的数值是7，那么OneHotEncoder为它分配的二进制数字的第七位就是1，其余队伍的第七位就是0。
每个可能的特征值都这样处理，而数据集会变得很大
End of explanation
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(random_state=14)
scores5 = cross_val_score(clf,X_teams_expanded,y_true,scoring="accuracy") 
print("Accuracy: {0:.1f}%".format(np.mean(socres5) * 100))
X_all = np.hstack([x_homehighter, X_teams])
clf = RandomForestClassifier(random_state=14)
scores6 = cross_val_score(clf, X_all, y_true, scoring='accuracy')
print("Accuracy: {0:.1f}%".format(np.mean(scores6) * 100))
Explanation: 使用随机森林
End of explanation
<END_TASK>