决策树
决策树的分支思想运用了if-then结构。决策树的划分运用了信息论中信息熵的概念,信息熵的计算公式如下:
决策树的划分依据之一-信息增益
特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:
信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
常见决策树使用方法:
- ID3:信息增益最大化原则
- C4.5:信息增益比 最大化原则
- CART:回归树:平方误差最小,分类树:基尼系数最小原则
基尼系数公式:
sklearn中决策树的API:sklearn.tree.DecisionTreeClassifier(criterion=‘gini’,max_depth=None,random-state=None)
criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
优点:简单的理解和解释,树木可视化。
需要很少的数据准备,其他技术通常需要数据归一化,
缺点:决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
决策树可能不稳定,因为数据的小变化可能会导致完全不同的树被生成。
def decision_tree():
taitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
#获取特征值和目标值
x = taitan[['pclass','age','room']]
y = taitan['survived']
#缺失值填充
x['age'].fillna(x['age'].mean(),inplace = True)
#分割数据集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
#特征工程 类别进行one-hot编码
x_train = x_train.to_dict(orient = "record")
dict = DictVectorizer()
x_train = dict.fit_transform(x_train)
x_test = dict.transform(x_test.to_dict(orient = 'record'))
dt = DecisionTreeClassifier()
dt.fit(x_train,y_train)
#预测准确率
print('预测准确率:',dt.score(x_test,y_train))
随机森林
定义:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
根据下列算法而建造每棵树:
用N来表示训练用例(样本)的个数,M表示特征数目。
输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
随机森林API:sklearn.ensemble.RandomForestClassifier(n_estimators = 10,criterion = ‘gini’,max_depth = None,bootstrap =Trap,random_state = None)。随机森林中的超参数可以使用网格搜索和交叉验证进行选择。
优点:
在当前所有算法中,具有极好的准确率
能够有效地运行在大数据集上
能够处理具有高维特征的输入样本,而且不需要降维
能够评估各个特征在分类问题上的重要性
对于缺省值问题也能够获得很好得结果
def randomforest():
#API在集成方法中
taitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
x = taitan[['pclass','age','room']]
y = taitan['survived']
#缺失值填充
x['age'].fill(x['age'].mean(),inplace = True)
#训练集和测试集分离
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
x_train = x_train.to_dict(orient= 'record')
RF = RandomForestClassifier()
#进行随机森林超参数的网格搜素
param = {'n_estimators':[100,200,300,500,800],'max_depth':[5,8,15,20,25]}
gc = GridSearchCV(RF,param_grid = param,cv =2)
gc.fit(x_train,y_train)
print('准确率:',gc.score(x_test,y_test))
print('最好的参数:',gc.best_params_)
return None