解读洛伦兹曲线的方法就是利用GINI系数: GINI系数可以用于任何一个表示均衡分配的分析之中,实际在市场的产品均衡度分析中会经常用到GINI系数这个指标。 再例如,在中国鸡精的品牌有太太乐、豪极,他们都属于雀巢,基本可以说中国的鸡精被雀巢所垄断,那么鸡精的GINI系数也非常的高。 如下图,黄蓝线间的面积越小表示收入分配越平均。 A=0时,A/(A+B)=0,则GINI系数为0,收入分配完全平等; B=0时,A/(A+B)=1,则GINI系数为1,收入分配绝对不平等。 所以GINI系数可以取0-1之间的任意数值,一般GINI系数<0.2表示收入绝对平均,0.2<GINI系数<0.3表示比较平均,0.3<GINI系数<0.4表示相对合理,0.4<GINI系数<0.5表示收入差距较大 ,GINI系数>0.6表示收入差距悬殊。
特征 A 条件下集合 D 的基尼指数: \operatorname{Gini}(D, A)=\frac{\left|D_{1}\right|}{|D|} \operatorname{Gini}\left probabilities = counts / len(labels) gini = 1 - np.sum(probabilities ** 2) return gini def calculate_gini_index = calculate_gini(left_labels) right_gini = calculate_gini(right_labels) # 计算基尼指数 total_gini ) / len(labels) gini_index = (left_weight * left_gini) + (right_weight * right_gini) return gini_index = calculate_gini_index(data, labels, feature_index, threshold) if gini_index < best_gini_index
代码实现 套用公式: def gini(a: int, b: int) -> float: return 1-pow(a/(a+b), 2)-pow(b/(a+b), 2) def gini_total(a: int, b: int, c: int, d: int) -> float: return (a+b)/(a+b+c+d) * gini(a, b) + (c +d)/(a+b+c+d) * gini(c, d) print(gini(13, 98)) print(gini(24, 29)) print(gini_total(13, 98, 24, 29) [i][0]/temp_denominator, 2) - np.power(data_list[i][1]/temp_denominator, 2) total_gini = temp_gini * temp_son / total_sum + total_gini return total_gini 测试结果 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn
Gini Impurity 在数据集中随机选择一个数据点,并随机分配给它一个数据集中存在的标签,分配错误的概率即为Gini impurity。 这是一个完美的决策树,把Gini Impurity为0.5的数据集分类为2个Gini Impurity为0的数据集。Gini Impurity== 0是能获得的最好的分类结果。 <- Gini_impurity(right) total_gini <- left_gini * left_len / total + right_gini * right_len /total is.null(Init_gini_impurity)){ Gini_gain <- Init_gini_impurity - total_gini result = c(variable_column = T } one_split_gini[order(one_split_gini[[colnames(one_split_gini)[5]]], decreasing = decreasing
2 gini 7 0.8764686 0.17450925 0.9955341 ## 2 gini 9 4 gini 7 0.8777288 0.28763325 0.9886491 ## 4 gini 9 6 gini 7 0.8753984 0.31209279 0.9865402 ## 6 gini 9 8 gini 7 0.8730885 0.32243634 0.9853204 ## 8 gini 9 2 gini 9 1 1 1 ## 2 gini 11 1 1 1
根据加权方式求和:Gini(工作)=4/10*(Gini(工作,是))+6/10*(Gini(工作,否))=0.27。 根据加权方式求和:Gini(房子)=5/10*(Gini(房子,是))+5/10*(Gini(房子,否))=0.4。 根据加权方式求和:Gini(信誉)=4/10*(Gini(信誉,一般))+2/10*(Gini(信誉,良好))+4/10*(Gini(信誉,很好))=0.45。 我们比较这三个数Gini(工作)=0.27、Gini(房子)=0.4、Gini(信誉)=0.45。我们发现这个三个数字中Gini(工作)=0.27最小,所以我们按照它来建立决策树。 根据加权方式求和:Gini(房子)=2/6*(Gini(房子,是))+4/6*(Gini(房子,否))=0。
ID3和C4.5分别采用信息增益和信息增益比来选择最优特征,但CART分类树采用Gini指数来进行特征选择。先来看Gini指数的定义。 Gini指数是针对概率分布而言的。 具体到实际的分类计算中,给定样本集合D的Gini指数计算如下 ? 相应的条件Gini指数,也即给定特征A的条件下集合D的Gini指数计算如下 ? 首先定义Gini指数的计算函数: def gini(nums): probs = [nums.count(i)/len(nums) for i in set(nums)] gini = sum([p*(1-p) for p in probs]) return gini 读入数据并计算标签的Gini指数: df = pd.read_csv('. index gini_Di = gini(subset[label].tolist()) # calculating gini
head=T) Gini<- ggplot(GiniData, aes(x=paste(GiniIndex,Country),y=GiniIndex,fill=GiniIndex%/%10)) Gini <- Gini +geom_bar(stat="identity",position="dodge")+coord_polar() Gini<- Gina + scale_fill_continuous (high="darkred",low="darkgreen") Gini<- Gini + theme( panel.background=element_rect(fill="white ="China"))) Gini<- Gini + geom_bar(stat="identity",position="dodge")+coord_polar() Gini<- Gini + scale_fill_continuous (high="darkred",low="darkgreen") Gini<- Gini + theme( panel.background=element_rect(fill="white
根据加权方式求和:Gini(工作)=4/10*(Gini(工作,是))+6/10*(Gini(工作,否))=0.27。 根据加权方式求和:Gini(房子)=5/10*(Gini(房子,是))+5/10*(Gini(房子,否))=0.4。 根据加权方式求和:Gini(信誉)=4/10*(Gini(信誉,一般))+2/10*(Gini(信誉,良好))+4/10*(Gini(信誉,很好))=0.45。 我们比较这三个数Gini(工作)=0.27、Gini(房子)=0.4、Gini(信誉)=0.45。我们发现这个三个数字中Gini(工作)=0.27最小,所以我们按照它来建立决策树。 根据加权方式求和:Gini(房子)=2/6*(Gini(房子,是))+4/6*(Gini(房子,否))=0。
) 在这个例子中,每组的基尼分数计算如下: Gini(group_1) = (1 - (1*1 + 0*0)) * 2/4 Gini(group_1) = 0.0 * 0.5 Gini(group_1) X1 < 2.771 Gini=0.444 X1 < 1.729 Gini=0.500 X1 < 3.678 Gini=0.286 X1 < 3.961 Gini=0.167 X1 < 2.999 Gini =0.375 X1 < 7.498 Gini=0.286 X1 < 9.002 Gini=0.375 X1 < 7.445 Gini=0.167 X1 < 10.125 Gini=0.444 X1 < 6.642 Gini=0.000 X2 < 1.785 Gini=0.500 X2 < 1.170 Gini=0.444 X2 < 2.813 Gini=0.320 X2 < 2.620 Gini=0.417 X2 < 2.209 Gini=0.476 X2 < 3.163 Gini=0.167 X2 < 3.339 Gini=0.444 X2 < 0.477 Gini=0.500 X2 < 3.235 Gini
) 在这个例子中,每组的基尼分数计算如下: Gini(group_1) = (1 - (1*1 + 0*0)) * 2/4 Gini(group_1) = 0.0 * 0.5 Gini(group_1) X1 < 2.771 Gini=0.444 X1 < 1.729 Gini=0.500 X1 < 3.678 Gini=0.286 X1 < 3.961 Gini=0.167 X1 < 2.999 Gini =0.375 X1 < 7.498 Gini=0.286 X1 < 9.002 Gini=0.375 X1 < 7.445 Gini=0.167 X1 < 10.125 Gini=0.444 X1 < 6.642 Gini=0.000 X2 < 1.785 Gini=0.500 X2 < 1.170 Gini=0.444 X2 < 2.813 Gini=0.320 X2 < 2.620 Gini=0.417 X2 < 2.209 Gini=0.476 X2 < 3.163 Gini=0.167 X2 < 3.339 Gini=0.444 X2 < 0.477 Gini=0.500 X2 < 3.235 Gini
train_test_split 采用不同的指标,基尼系数或者信息熵进行建模,使用的是X_train和y_train 实例化 fit拟合 预测功能:采用上面的两种实例化进行预测y_pred = clf_gini.predict return X, y, X_train, X_test, y_train, y_test # 使用基尼系数进行训练 training with giniIndex def train_using_gini (X_train, y_train): # 先建立实例,再进行fit拟合 clf_gini = DecisionTreeClassifier(criterion="gini" # ("result using gini Index:") y_pred_gini = prediction(X_test, clf_gini) cal_accuracy(y_test, y_pred_gini) print("result using Entropy:") y_pred_entropy = prediction(X_test, clf_entropy)
定义基尼指数: Gini\_index(D,A)=\sum_{v=1}^V\frac{|D^v|}{|D|}Gini(D^v) 若根据outlook来划分,14天中有5天Sunny(2正3负)、5天 Rain(3正2负)、4天Overcast(4正0负),则: Gini(D_{sunny})=1-(\frac{2}{5}^2+\frac{3}{5}^2)=0.48 Gini(D_{rain})= 1-(\frac{3}{5}^2+\frac{2}{5}^2)=0.48 Gini(D_{overcast})=1-(\frac{4}{4}^2+\frac{0}{4}^2)=0 Gini\_index B)=Gini\_index(D,T_B=5)=0 。 然后决策选择特征A还是特征B作为划分依据: Gini\_index(D,A)>Gini\_index(D,B) 故选择特征B作为划分依据。
){ library(dplyr) GX<-Gini(Salary_gini_data$Salary) GY< -Gini(Salary_gini_data$aftertax_salary) CT<-Gini(Salary_gini_data$Salary_tax ) CY<-Salary_gini_data%>%arrange(Salary)%>%. [,"aftertax_salary"]%>%Gini_N t <-sum(Salary_gini_data$Salary_tax)/sum(Salary_gini_data$Salary) CXT<-Gini(Salary_gini_data$tax_Salary) P <-CT-GX
定义基尼指数: Gini\_index(D,A)=\sum_{v=1}^V\frac{|D^v|}{|D|}Gini(D^v) 若根据outlook来划分,14天中有5天Sunny(2正3负)、5天 Rain(3正2负)、4天Overcast(4正0负),则: Gini(D_{sunny})=1-(\frac{2}{5}^2+\frac{3}{5}^2)=0.48 Gini(D_{rain})= 1-(\frac{3}{5}^2+\frac{2}{5}^2)=0.48 Gini(D_{overcast})=1-(\frac{4}{4}^2+\frac{0}{4}^2)=0 Gini\_index B)=Gini\_index(D,T_B=5)=0 。 然后决策选择特征A还是特征B作为划分依据: Gini\_index(D,A)>Gini\_index(D,B) 故选择特征B作为划分依据。
因此Gini指数越小,说明数据集越集中,也就是纯度越高。它的概念等价于信息熵,熵越小说明信息越集中,两者的概念是非常近似的。 所以当我们使用Gini指数来作为划分依据的时候,选择的是切分之后Gini指数尽量小的切分方法,而不是尽量大的。 从上图当中可以看出来,Gini指数和信息熵的效果非常接近,一样可以非常好地反应数据划分的纯度。 我们只需要把之前的信息增益比改成Gini指数即可: from collections import Counter def gini_index(dataset): dataset = np.array (left) + right.shape[0] / n * gini_index(right) 然后选择拆分的函数稍微调整一下,因为Gini指数越小越好,之前的信息增益和信息增益比都是越大越好。
gini_parent = gini_impurity(y_subset) impurity_reduction = gini_parent - weighted_gini print (f"不纯度减少量(信息增益)值: {impurity_reduction:.6f}, gini_parent: {gini_parent}, weighted_gini: {weighted_gini }") print(f"threshold: {threshold:.2f}, gini_left: {gini_left:.6f}, gini_right: {gini_right:.6f}, 'gini_right': gini_right, 'weighted_gini': weighted_gini, 'impurity_reduction': impurity_reduction : 0.5, weighted_gini: 0.3055555555555555threshold: 1.35, gini_left: 0.000000, gini_right: 0.424383, weighted_gini
** 2 # Gini index of the right leafe Gini_2 = 1-(n_2_yes/(n_2_yes + n_2_no)) ** 2-(n_2_no/( Gini_attribute = (n_1/n) * Gini_1 + (n_2/n) * Gini_2 Gini_attribute = round(Gini_attribute, 3) print(f'Gini_{attribute} = {Gini_attribute}') return Gini_attribute def find_attribute_that_shows_the_smallest_gini_index attributes = [] gini_indexes = [] for attribute in df.columns[:-1]: # calculate gini (gini_index) # create a data frame using the just calculated gini index for each feature/attribute
) ** 2 # Gini index of the right leafe Gini_2 = 1-(n_2_yes/(n_2_yes + n_2_no)) ** 2-( ) as root node Gini_attribute = (n_1/n) * Gini_1 + (n_2/n) * Gini_2 Gini_attribute = round( Gini_attribute, 3) print(f'Gini_{attribute} = {Gini_attribute}') return Gini_attribute calculate gini index for attribute as root note using the defined function "calc_weighted_gini_index" of the data set:") d_calculated_indexes = {'attribute':attributes,'gini_index':gini_indexes
predictionsAndLabels) } val model = DecisionTree.trainClassifier(trainData,7,Map[Int,Int](),"gini ,20,300),0.9319721451536285) ((entropy,20,10),0.9273681094366382) ((gini,20,10),0.9195954644654499) ( (gini,1,10),0.633916339077334) ((gini,1,300),0.6335772755123819) ((entropy,1,300),0.48759922342395684 ,30,300),0.6327390828416625) ((gini,20,300),0.6319645721602997) ((gini,10,256),0.6190078690285227) (( gini,30,256),0.6165724632193483) ((gini,20,256),0.6149373851142489) ((gini,10,300),0.596522963381135)