1.泰坦尼克号:随机森林

1.泰坦尼克号:随机森林,第1张

文章目录
  • 解决思路
  • 二、处理过程
    • 第一步:加载源数据集
    • 第二步:数据清洗
    • 第三步:进行特征构建
      • (二)构建新的字段,基于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() 


(二)构建新的字段,基于scikit-learn中的LabelEncoder()
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'])


(3)通过Pandas中的get_dummies() 进行编码
  • 方式一:特征选择
# 定义一个标签
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上预测


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/734701.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存