- 解决思路
- 二、处理过程
- 第一步:加载源数据集
- 第二步:数据清洗
- 第三步:进行特征构建
- (二)构建新的字段,基于scikit-learn中的LabelEncoder()
- (3)通过Pandas中的get_dummies() 进行编码
- 获取训练集和测试集
- 随机森林算法实现
- (1)对特征一进行训练
# 列的名称,tolist()完整展示列表里的内容
data_raw.columns.tolist()
解决思路
二、处理过程
第一步:加载源数据集
data_raw = pd.read_csv('train.csv')
data_val = pd.read_csv('test.csv')
# 显示部分数据
data_raw.head()
data_raw.info()
# 列名称转换为小写格式
data_raw.columns = data_raw.columns.str.lower() # 转换为小写
data_val.columns = data_val.columns.str.lower() # 转换为小写
# 绘制图形
import seaborn as sns
sns.countplot(data_raw['survived'])
# 合并两个数据集,进行统一的清洗
data_all = [data_raw, data_val]
第二步:数据清洗
# 合并两个数据集,进行统一的清洗
data_all = [data_raw, data_val]
data_raw.isnull().sum() # 查看训练集中的空值
# 对源数据集进行描述
data_raw.describe(include='all')
# 对原始数据集(训练集+验证集)进行清理
for dataset in data_all:
# 补足空缺值,(空缺值比较少的)
dataset['age'].fillna(dataset['age'].median(), inplace=True) # 中位数
dataset['fare'].fillna(dataset['fare'].median(), inplace=True)
# 字符串的,mode()[0],返回出现率最高的
dataset['embarked'].fillna(dataset['embarked'].mode()[0], inplace=True)
# 删除一些字段
drop_columns = ['cabin', 'passengerid', 'ticket']
data_raw.drop(drop_columns, axis=1, inplace=True)
data_val.drop(drop_columns, axis=1, inplace=True)
第三步:进行特征构建
for dataset in data_all:
# 构建新的字段:
# (1)family_size 家庭规模:sibsp + parch (兄弟姐妹+父母+1,1是我自己)
dataset['family_size'] = dataset['sibsp'] + dataset['parch'] + 1
# (2)单身 single ,1 : 单身, 0 :非单身
dataset['single'] = 1
dataset['single'].loc[dataset['family_size'] > 1] = 0 # 0 :不是单身
# (3)身份 title (expand=True 返回的是表格形式)
dataset['title'] = dataset['name'].str.split(', ', expand=True)[1].str.split('.', expand=True)[0]
# dataset['title'] = dataset['name'].apply(lambda x : x.split(,)[1]).apply(lambda x : x.split('.')[0])
# (4) 票价 fare_bin # 根据票价,分成4组(每组的元素个数一致)
dataset['fare_bin'] = pd.qcut(dataset['fare'], 4)
# (5)年龄 age_bin # 根据年龄分组,分成5组(每组的元素不一致)
dataset['age_bin'] = pd.cut(dataset['age'].astype(int), 5)
# 根据title统计人数
data_raw['title'].value_counts()
title_names = (data_raw['title'].value_counts() < 10)
# title :将那些称谓所在的人数小于10的数据,全部归为一类:other
data_raw['title'] = data_raw['title'].apply(lambda x : 'other' if title_names[x] else x)
data_raw['title'].value_counts()
#不同的称呼,根据title分组,生存的概率
data_raw['survived'].groupby(data_raw['title']).mean()
from sklearn.preprocessing import LabelEncoder
label = LabelEncoder()
for dataset in data_all:
# (1)新字段:sex_code
dataset['sex_code'] = label.fit_transform(dataset['sex'])
# (2)新字段:embarked_code
dataset['embarked_code'] = label.fit_transform(dataset['embarked'])
# (3)新字段:title_code
dataset['title_code'] = label.fit_transform(dataset['title'])
# (4)新字段:age_bin_code
dataset['age_bin_code'] = label.fit_transform(dataset['age_bin'])
# (5)新字段:fare_bin_code
dataset['fare_bin_code'] = label.fit_transform(dataset['fare_bin'])
- 方式一:特征选择
# 定义一个标签
Target = ['survived'] # 标签
data_columns_one = ['sex', 'pclass', 'embarked', 'title', 'sibsp', 'parch', 'age', 'fare', 'family_size', 'single']
columns_one = Target + data_columns_one
# pd.get_dummies相当于onehot编码,常用与把离散的类别信息转化为onehot编码形式。
data_one_dummy = pd.get_dummies(data_raw[data_columns_one])
data_one_dummy_list = data_one_dummy.columns.tolist()
- 方式一
X_train_one, X_test_one, y_train_one, y_test_one = model_selection.train_test_split(data_one_dummy[data_one_dummy_list],
data_raw[Target],
random_state = 0)
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(max_features='auto',
random_state=1,
n_jobs=-1)
param_gird = {
'criterion' : ['gini', 'entropy'],
'min_samples_leaf' : [1, 5, 10], #叶子结点
'min_samples_split' : [2, 4, 10, 12, 16],
'n_estimators' : [50, 100, 400, 700, 1000]
}
gs = GridSearchCV(estimator=rf,
param_grid=param_gird,
scoring= 'accuracy',
cv=3,
n_jobs=-1)
(1)对特征一进行训练
gs = gs.fit(X_train_one, y_train_one)
print(gs.best_score_)
# 最好的参数
print(gs.best_params_)
# 创建一个对象
rf2 = RandomForestClassifier(criterion='entropy',
min_samples_leaf=5,
min_samples_split=12,
n_estimators=50,
n_jobs=-1,
random_state=1)
# 根据特征的重要性排序
pd.concat((pd.DataFrame(X_train_one.iloc[:, 1:].columns, columns=['Variable']),
pd.DataFrame(rf2.feature_importances_, columns=['importance'])),
axis=1).sort_values(by='importance', ascending=False)
# 在test上进行预测
pred = rf2.predict(X_test_one)
pred_df = pd.DataFrame(pred, columns=['survived'])
# !!! 注意:在最终的test.csv上预测
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)