我有一个数据集,其中包含年龄,城市,儿童年龄等信息,以及结果(确认,接受).
为了帮助"工作流程"的模型化,我想基于以前的数据集自动创建决策树.
我已经看了http://en.wikipedia.org/wiki/Decision_tree_learning,我知道这个问题显然不明显.
我只是想对一些算法或一些关于这个主题的库提出建议,这可以帮助我构建基于样本的决策树.
java algorithm classification machine-learning decision-tree
我一直在评估Drools作为规则引擎,用于我们的业务Web应用程序.
我的用例是订单管理应用程序.
规则如下:
- 如果用户类型为"特殊",则额外提供5%的折扣.
- 如果用户已经进行了10次以上的购买,请额外享受3%的折扣.
- 如果产品类别为"旧",请向价值5美元的用户赠送礼品篮.
- 如果产品类别为"新",请向价值1美元的用户赠送礼品篮
- 如果用户过去已购买超过1000美元,则免费送货
我看到的直接挑战是:
- 没有有意义的用户界面可以提供给最终用户修改规则.
- 从最终用户的角度来看,Guvnor UI或任何修改drl文件的编辑器都是不可接受的 - 这些规则中的大多数都将在db中可用的大量数据上运行
所以,
- 我想让管理员用户在我的Web App UI中指定这些规则.
- 我可以将这些"规则"存储在数据库中,然后通过Drools对它们进行操作 - 至少允许我通过"自己的"UI"修改"这些规则.所以这就像数据库中的决策表.
- 最好的方法是什么?
我正在使用构建决策树
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X_train, Y_train)
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,我如何探索决策树?
例如,如何找到X_train中的哪些条目出现在特定的叶子中?
我试图了解如何计算sci-kit学习中的决策树的特征重要性.之前已经问过这个问题,但我无法重现算法提供的结果.
例如:
from StringIO import StringIO
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree.export import export_graphviz
from sklearn.feature_selection import mutual_info_classif
X = [[1,0,0], [0,0,0], [0,0,1], [0,1,0]]
y = [1,0,1,1]
clf = DecisionTreeClassifier()
clf.fit(X, y)
feat_importance = clf.tree_.compute_feature_importances(normalize=False)
print("feat importance = " + str(feat_importance))
out = StringIO()
out = export_graphviz(clf, out_file='test/tree.dot')
Run Code Online (Sandbox Code Playgroud)
导致特征重要性:
feat importance = [0.25 0.08333333 0.04166667]
Run Code Online (Sandbox Code Playgroud)
并给出以下决策树:
现在,这个答案对一个类似问题建议的重要性计算公式为
其中G是节点杂质,在这种情况下是基尼杂质.据我所知,这是杂质减少.但是,对于功能1,这应该是:
这个答案表明重要性由到达节点的概率加权(通过到达该节点的样本的比例来近似).同样,对于功能1,这应该是:
两个公式都提供了错误的结果.如何正确计算特征重要性?
一点背景:作为一种在C++中学习多节点树的方法,我决定生成所有可能的TicTacToe板并将它们存储在一棵树中,这样从一个节点开始的分支都是可以跟随该节点的板,以及节点是一步到位的板.在那之后,我认为使用该树作为决策树编写AI来玩TicTacToe会很有趣.
TTT是一个可以解决的问题,一个完美的玩家永远不会丢失,所以我第一次尝试AI时编码似乎很简单.
现在,当我第一次实现AI时,我回过头来为每个节点添加两个字段:X将赢得的次数和O将在该节点下的所有子节点中获胜的次数.我认为最好的解决方案就是让我的每一步动作都选择AI,然后选择最能赢得次数的子树.然后我发现虽然它在大部分时间都是完美的,但我找到了可以击败它的方法.这对我的代码来说不是问题,只是我用AI选择它的路径的问题.
然后我决定让它选择具有计算机最大胜利或人类最大损失的树,以较多者为准.这使它表现更好,但仍然不完美.我仍然可以击败它.
所以我有两个想法,我希望得到更好的输入:
1)而不是最大化赢或输,而是我可以为胜利分配1,为平局分配0,为亏损分配-1.然后选择具有最高值的树将是最佳移动,因为下一个节点不能是导致丢失的移动.这是电路板生成中的一个简单更改,但它保留了相同的搜索空间和内存使用量.要么...
2)在棋盘生成期间,如果有一个棋盘使X或O在下一步中获胜,则只会产生阻止该胜利的孩子.不会考虑其他子节点,然后生成将在此之后正常进行.它缩小了树的大小,但后来我必须实现一个算法来确定是否有一个移动获胜,我认为这只能在线性时间内完成(我认为让板子生成慢很多?)
哪个更好,还是有更好的解决方案?
我已经编写了几年但我仍然没有得到伪编码或实际上在代码中思考的问题.由于这个问题,我无法确定在创建学习决策树时应该做些什么.
以下是我看过的几个网站,相信我还有更多
除了Ian Millington的AI for Games之类的几本书,其中包括决策树中使用的不同学习算法和游戏编程的行为数学,这基本上都与决策树和理论有关.我理解决策树的概念以及Entropy,ID3以及如何交织遗传算法以及决策树决定GA的节点.他们提供了很好的洞察力,但不是我真正想要的.
我确实有一些为决策树创建节点的基本代码,我相信我知道如何实现实际逻辑,但如果我没有程序的目的或涉及熵或学习算法,那就没用了.
我要问的是,有人可以帮我弄清楚我需要做些什么来创建这个学习决策树.我将自己的节点放在一个自己的类中,通过函数来创建树,但是如何将熵放入其中,如果它有一个类,一个结构我不知道如何把它放在一起.伪代码和我对所有这些理论和数字的看法.如果只知道我需要编码的话,我可以将代码放在一起.任何指导将不胜感激.
基本上我将如何解决这个问题?
添加学习算法,如ID3和Entropy.该如何设置?
一旦我知道如何解决所有这些,我计划将其实现为一个状态机,它以游戏/模拟格式经历不同的状态.所有这些都已经设置好了,我只是认为这可能是独立的,一旦我弄清楚,我可以将它移动到另一个项目.
这是我现在的源代码.
提前致谢!
Main.cpp:
int main()
{
//create the new decision tree object
DecisionTree* NewTree = new DecisionTree();
//add root node the very first 'Question' or decision to be made
//is monster health greater than player health?
NewTree->CreateRootNode(1);
//add nodes depending on decisions
//2nd decision to be made
//is monster strength greater than player strength?
NewTree->AddNode1(1, 2);
//3rd decision
//is the monster closer than home base? …Run Code Online (Sandbox Code Playgroud) 我收到以下错误
c50代码名为exit,值为1
我在Kaggle提供的巨大数据上这样做
# Importing datasets
train <- read.csv("train.csv", sep=",")
# this is the structure
str(train)
Run Code Online (Sandbox Code Playgroud)
输出: -
'data.frame': 891 obs. of 12 variables:
$ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ...
$ Survived : int 0 1 1 1 0 0 0 0 1 1 ...
$ Pclass : int 3 1 3 1 3 3 1 3 3 2 ...
$ Name : Factor w/ 891 levels "Abbing, Mr. Anthony",..: 109 191 …Run Code Online (Sandbox Code Playgroud) 我试图使用分类变量训练使用GradientBoostingClassifier的模型.
以下是原始代码示例,仅用于尝试输入分类变量GradientBoostingClassifier.
from sklearn import datasets
from sklearn.ensemble import GradientBoostingClassifier
import pandas
iris = datasets.load_iris()
# Use only data for 2 classes.
X = iris.data[(iris.target==0) | (iris.target==1)]
Y = iris.target[(iris.target==0) | (iris.target==1)]
# Class 0 has indices 0-49. Class 1 has indices 50-99.
# Divide data into 80% training, 20% testing.
train_indices = list(range(40)) + list(range(50,90))
test_indices = list(range(40,50)) + list(range(90,100))
X_train = X[train_indices]
X_test = X[test_indices]
y_train = Y[train_indices]
y_test = Y[test_indices]
X_train = pandas.DataFrame(X_train) …Run Code Online (Sandbox Code Playgroud) python machine-learning decision-tree scikit-learn ensemble-learning
我正在尝试可视化我的DecisionTree,但得到错误代码是:
X = [i[1:] for i in dataset]#attribute
y = [i[0] for i in dataset]
clf = tree.DecisionTreeClassifier()
dot_data = StringIO()
tree.export_graphviz(clf.fit(train_X, train_y), out_file=dot_data)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("tree.pdf")
Run Code Online (Sandbox Code Playgroud)
错误是
Traceback (most recent call last):
if data.startswith(codecs.BOM_UTF8):
TypeError: startswith first arg must be str or a tuple of str, not bytes
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释我的问题是什么?非常感谢!
考虑到上述(树枝)条件存在,我猜测它是条件概率.但是,我不清楚.
如果您想了解有关所用数据的更多信息或我们如何获得此图表,请访问:http://machinelearningmastery.com/visualize-gradient-boosting-decision-trees-xgboost-python/
decision-tree ×10
python ×5
scikit-learn ×3
algorithm ×2
java ×2
c++ ×1
drools ×1
entropy ×1
kaggle ×1
pydot ×1
r ×1
rules ×1
tic-tac-toe ×1
xgboost ×1