1、有放回的重采样;
2、相互独立地并行学习这些弱学习器(KNN,逻辑回归,决策树,SVM等等);
3、对于分类问题,根据分类器进行投票(软投票和硬投票)来确定最终的分类结果;对于预测性问题将回归结果进行平均,最终用于样本的预测值。
硬投票:少数服从多数的原则;
硬投票:各自分类器的概率值进行加权平均。
bagging+CART树
随机森林在bagging基础上做了修改
从样本集中用Bootstrap采样选出n个样本;
从所有属性中随机选择k个属性,选择最佳分割 属性作为节点建立CART决策树;
重复以上两步m次,即建立了m棵决策树
针对m棵CART树的随机森林,对分类问题利用投票法,将最高得票的类别用于最终的判断结果;对于回归问题利用均值法,将其用作预测样本的最终结果。
# 加载数据集,并进行分析
df=pd.read_csv(r"C:\Users\Administrator\Desktop\insurance.csv")
# 查看数据前五行
df.head()
age sex bmi children smoker region charges
0 19 female 27.900 0 yes southwest 16884.92400
1 18 male 33.770 1 no southeast 1725.55230
2 28 male 33.000 3 no southeast 4449.46200
3 33 male 22.705 0 no northwest 21984.47061
4 32 male 28.880 0 no northwest 3866.85520
# 剔除缺失值
df=df.dropna()
# 查看数据基本信息
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1338 entries, 0 to 1337
Data columns (total 7 columns):
age 1338 non-null int64
sex 1338 non-null object
bmi 1338 non-null float64
children 1338 non-null int64
smoker 1338 non-null object
region 1338 non-null object
charges 1338 non-null float64
dtypes: float64(2), int64(2), object(3)
memory usage: 83.6+ KB
# 查看数据分布状况
df.describe()
# 对类别变量进行编码
le_sex=LabelEncoder()
le_smoker=LabelEncoder()
le_region=LabelEncoder()
df['sex']=le_sex.fit_transform(df['sex'])
df['smoker']=le_smoker.fit_transform(df['smoker'])
df['region']=le_smoker.fit_transform(df['region'])
variables=['sex','smoker','region','age','bmi','children']
X=df[variables]
sc=StandardScaler()
X=sc.fit_transform(X)
Y=df['charges']
# 分割数据集
X_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.2,random_state=1234)
# 预设各参数的不同选项值
max_depth=[10,11,12,13,14,15]
min_samples_split=[2,4,6,8]
min_samples_leaf=[2,4,8,10,12]
parameters={'max_depth':max_depth,'min_samples_split':min_samples_split,'min_samples_leaf':min_samples_leaf}
# 网格搜索法,测试不同的参数值
grid_dtcateg=GridSearchCV(estimator=DecisionTreeRegressor(),param_grid=parameters,cv=10)
# 模型拟合
grid_dtcateg.fit(X_train,y_train)
# 返回最佳组合的参数值
grid_dtcateg.best_params_
{'max_depth': 10, 'min_samples_leaf': 12, 'min_samples_split': 2}
# 构建用于回归的决策树,默认使用均方误差选择节点的最佳分割字段
CART_Reg=DecisionTreeRegressor(max_depth=12,min_samples_leaf=12,min_samples_split=2,random_state=1234)
# CART_Reg=DecisionTreeRegressor()
# 回归树拟合
CART_Reg.fit(X_train,y_train)
# 回归树在测试集上的预测
pred=CART_Reg.predict(X_test)
# 计算衡量模型好坏的MAE值
print(sklearn.metrics.mean_absolute_error(y_test,pred))
2579.3568483513386
# 构建用于回归的随机森林,默认使用均方误差来选择节点的最佳分割字段
regressor=RandomForestRegressor(n_estimators=1000)
regressor.fit(X_train,y_train)
y_test_pred=regressor.predict(X_test)
# 计算衡量模型好坏的MAE值
print(sklearn.metrics.mean_absolute_error(y_test,y_test_pred))
2424.8362558463846
如上结果显示,随机森林算法在测试集上的MAE值为2425,比单棵决策树的MAE值要小,可以说明随机森林的拟合效果要比单棵回归树理想。
# 构建变量重要性的序列
regressor.feature_importances_
importance=pd.Series(regressor.feature_importances_,index=variables)
# print(importance)
importance.sort_values().plot('barh')
数据源链接:https://pan.baidu.com/s/16lvMOHnrJM8FrwlKhLEHBg
提取码:30h3