数据探索和模型建构

news2024/11/23 3:03:26

数据探索:观察数据之间的关系

分别判断 性别(sex)、船舱等级(Pclass)、年龄(Age)、有无父母子女(Parch)、有无兄弟姐妹(SibSp)、票价(Fare) 和 港口(Embarked)等因素和 存活(Survived)之间的关系

In [27]:

sex_survived_cor = train_data[['Sex','Survived']]
sex_survived_cor.groupby('Sex').mean().plot.bar(width=0.1)

Out[27]:

<Axes: xlabel='Sex'>
train_data.loc[:, 'Sex'].value_counts()

Out[28]:

male      577
female    314
Name: Sex, dtype: int64

In [29]:

pclass_survived_cor = train_data[['Pclass','Survived']]
pclass_survived_cor.groupby('Pclass').mean().plot.bar(width=0.2)

Out[29]:

<Axes: xlabel='Pclass'>
parch_df, no_parch_df = train_data[train_data.Parch != 0], train_data[train_data.Parch == 0]

prach_no_survived,prach_survived = parch_df['Survived'].value_counts()[:2]
noprach_no_survived, noparch_survived = no_parch_df['Survived'].value_counts()[:2]

plt.bar(['parch','noparch'],[prach_survived / (prach_no_survived+prach_survived),noparch_survived / (noprach_no_survived+noparch_survived)],width=0.2)

Out[30]:

<BarContainer object of 2 artists>
sibsp_df, no_sibsp_df = train_data[train_data.SibSp != 0], train_data[train_data.SibSp == 0]

sibsp_no_survived,sibsp_survived = sibsp_df['Survived'].value_counts()[:2]
nosibsp_no_survived,nosibsp_survived = no_sibsp_df['Survived'].value_counts()[:2]

plt.bar(['sibsp','nosibsp'],[sibsp_survived/(sibsp_no_survived+sibsp_survived),nosibsp_survived/(nosibsp_no_survived+nosibsp_survived)],width=0.2)

Out[31]:

<BarContainer object of 2 artists>

1、观察fare对应的分布情况

2、对于fare和survived的分布情况进行分析

In [32]:

plt.figure(figsize=(10,5))
train_data.Fare.hist(bins=70)

Out[32]:

<Axes: >
fare_df = train_data[['Fare','Survived']]
fare_df.boxplot(column='Fare', by='Survived',showfliers=False)

Out[33]:

<Axes: title={'center': 'Fare'}, xlabel='Survived'>
 
 

使用皮尔逊相关系数来分析变量之间的关系

模型构建以及模型评价¶

In [42]:

from sklearn import model_selection

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

def top_k_features(X,Y,top_k=6):
    
    # random forest
    rfc = RandomForestClassifier(random_state=0)
    rf_search_grid = {'n_estimators': [500,1000], 'min_samples_split': [2, 3], 'max_depth': [10,20]} 
    rf_grid = model_selection.GridSearchCV(rfc, rf_search_grid, n_jobs=25, cv=10, verbose=1)
    rf_grid.fit(X, Y)
    
    feature_importance = rf_grid.best_estimator_.feature_importances_
    feature_importance_df = pd.DataFrame({'feature':list(X), "importance":feature_importance}).sort_values('importance',ascending=False)
    top_k_feature_importance_df = feature_importance_df.head(top_k)['feature']
    
    # decision tree option choice
#     dtc = DecisionTreeClassifier(random_state=0)
#     dt_search_grid = {'min_samples_split': [2, 3], 'max_depth': [10,20]}
#     dt_grid = model_selection.GridSearchCV(dtc, dt_search_grid, n_jobs=25, cv=10, verbose=1)
#     dt_grid.fit(X, Y)
#     feature_importance = rf_grid.best_estimator_.feature_importances_
#     feature_importance_df = pd.DataFrame({'faeture':list(X), "importance":feature_importance}).sort_values('importance',ascending=Falsel)
#     top_k_feature_importance_df = feature_importance_df.head(top_k)['feature']
    return top_k_feature_importance_df, feature_importance_df

In [43]:

X = train_data.drop(['Survived'],axis=1)
Y = train_data['Survived']

In [44]:

top_k_features, feature_importance = top_k_features(X,Y)
Fitting 10 folds for each of 8 candidates, totalling 80 fits

通过随机森林,我们能够得到数据集中的重要特征,并且忽略无关紧要的特征

In [45]:

rf_feature_importance = 100 * (feature_importance.importance / feature_importance.importance.max())

rf_idx = np.where(rf_feature_importance)[0]
pos = np.arange(rf_feature_importance.shape[0])

plt.barh(pos, rf_feature_importance[::-1])
plt.yticks(pos, feature_importance.feature[::-1])
plt.xlabel("Importance Score")
plt.title("RFC feature importance")

Out[45]:

Text(0.5, 1.0, 'RFC feature importance')

模型构建

将上述对 train_data 的分析扩展到整个数据集

常见的方法有 Bagging、Boosting 和 Stacking 这三种

Bagging:就是基于多个基分类器进行加权和投票来得到预测结果

Boosting:每一基学习器是在上一个学习器学习的基础上,会修正上个学习器的错误,像AdaBoost

Stacking:用一个学习器去组合上层的基学习器,因此会产生分层的结构

In [46]:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn import model_selection
from sklearn.model_selection import KFold

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier,RandomForestRegressor
from sklearn.svm import SVC

from sklearn.preprocessing import StandardScaler

In [47]:

train_data = pd.read_csv(r'../data/1/train.csv')
test_data = pd.read_csv(r'../data/1/test.csv')

In [48]:

test_data['Survived'] = 0
concat_data = train_data.append(test_data)
C:\Users\MrHe\AppData\Local\Temp\ipykernel_41864\2851212731.py:2: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
  concat_data = train_data.append(test_data)

In [51]:

# first step
concat_data.loc[concat_data.Cabin.notnull(), 'Cabin'] = '1'
concat_data.loc[concat_data.Cabin.isnull(), 'Cabin'] = '0'

# second step
# concat_data.loc[concat_data.Embarked.isnull(),'Embarked'] = concat_data.Embarked.dropna().mode().values

# third step
embark_dummies = pd.get_dummies(concat_data.Embarked)
concat_data = pd.concat([concat_data,embark_dummies],axis=1)

# 4
sex_dummies = pd.get_dummies(concat_data.Sex)
concat_data = pd.concat([concat_data,sex_dummies],axis=1)

# 5
concat_data['Fare'] = concat_data.Fare.fillna(50)
concat_df = concat_data[['Age', 'Fare', 'Pclass', 'Survived']]
train_df_age = concat_df.loc[concat_data['Age'].notnull()]
predict_df_age = concat_df.loc[concat_data['Age'].isnull()]
X = train_df_age.values[:, 1:]
Y = train_df_age.values[:, 0]
regr = RandomForestRegressor(n_estimators=1000, n_jobs=-1)
regr.fit(X, Y)
predict_ages = regr.predict(predict_df_age.values[:,1:])
concat_data.loc[concat_data.Age.isnull(), 'Age'] = predict_ages

# 6
concat_data['Age'] = StandardScaler().fit_transform(concat_data.Age.values.reshape(-1,1))

# 7
concat_data['Fare'] = pd.qcut(concat_data.Fare, 5)
concat_data['Fare'] = pd.factorize(concat_data.Fare)[0]

# 8
concat_data.drop(['Embarked','Sex','PassengerId',"Name","Ticket"],axis=1,inplace=True)

In [52]:

def top_k_features(X,Y,top_k=6):
    
    # random forest
    rfc = RandomForestClassifier(random_state=0)
    rf_search_grid = {'n_estimators': [500,1000], 'min_samples_split': [2, 3], 'max_depth': [10,20]} 
    rf_grid = model_selection.GridSearchCV(rfc, rf_search_grid, n_jobs=25, cv=10, verbose=1)
    rf_grid.fit(X, Y)
    
    feature_importance = rf_grid.best_estimator_.feature_importances_
    feature_importance_df = pd.DataFrame({'feature':list(X), "importance":feature_importance}).sort_values('importance',ascending=False)
    top_k_features = feature_importance_df.head(top_k)['feature']
    
    # decision tree option choice
#     dtc = DecisionTreeClassifier(random_state=0)
#     dt_search_grid = {'min_samples_split': [2, 3], 'max_depth': [10,20]}
#     dt_grid = model_selection.GridSearchCV(dtc, dt_search_grid, n_jobs=25, cv=10, verbose=1)
#     dt_grid.fit(X, Y)
#     feature_importance = rf_grid.best_estimator_.feature_importances_
#     feature_importance_df = pd.DataFrame({'faeture':list(X), "importance":feature_importance}).sort_values('importance',ascending=Falsel)
#     top_k_feature_importance_df = feature_importance_df.head(top_k)['feature']
    return top_k_features, feature_importance_df

In [53]:

X = concat_data[:len(train_data)].drop(['Survived'],axis=1)
Y = concat_data[:len(train_data)]['Survived']
test_X = concat_data[len(train_data):].drop(['Survived'],axis=1)

top_k_features, feature_importance_df = top_k_features(X,Y)

filter_X, filter_test_X = pd.DataFrame(X[top_k_features]),pd.DataFrame(test_X[top_k_features])
Fitting 10 folds for each of 8 candidates, totalling 80 fits

由于在训练集上面进行训练,为了避免数据的泄露,在这里采用的是 K 折交叉验证进行训练的过程

In [55]:

n_train, n_test = filter_X.shape[0], filter_test_X.shape[0]
kf = KFold(n_splits=10,random_state=0,shuffle=True)

def k_fold_train(clf, x_train, y_train, x_test):
    pro_train = np.zeros((n_train,))
    pro_test = np.zeros((n_test,))
    pro_test_skf = np.empty((10, n_test))
    
    for i, (train_idx, test_idx) in enumerate(kf.split(x_train)):
        x_train_sample = x_train[train_idx]
        y_train_sample = y_train[train_idx]
        x_test_sample = x_train[test_idx]
        
        clf.fit(x_train_sample, y_train_sample)
        pro_train[test_idx] = clf.predict(x_test_sample)
        
        pro_test_skf[i,:] = clf.predict(x_test)
    
    pro_test[:] = pro_test_skf.mean(axis=0)
    return pro_train.reshape(-1, 1), pro_test.reshape(-1,1)

In [56]:

rfc = RandomForestClassifier(n_estimators=500, warm_start=True, max_features='sqrt',max_depth=6, 
                            min_samples_split=3, min_samples_leaf=2, n_jobs=-1, verbose=0)

dtc = DecisionTreeClassifier(max_depth=6)

svm = SVC(kernel='linear', C=0.025)

这里给大家提供使用 top-k feature 的方法

In [57]:

# 1
X, Y, test_X = X.values, Y.values, test_X.values
# 2
# X, Y, test_X = filter_X.values, Y.values, filter_test_X.values

In [58]:

rfc_train, rfc_test = k_fold_train(rfc, X, Y, test_X)
dtc_train, dtc_test = k_fold_train(dtc, X, Y, test_X)
svm_train, svm_test = k_fold_train(svm, X, Y, test_X)
# 评分矩阵
def score(predictions, labels):
    return np.sum([1 if p == a else 0 for p, a in zip(predictions, labels)]) / len(labels)

In [60]:

from sklearn.ensemble import VotingClassifier

vclf = VotingClassifier(estimators=[('rfc', rfc), ('dtc', dtc), ('svm', SVC(kernel='linear', C=0.025, probability=True))], voting='soft',
                       weights=[1,1,3])

vclf.fit(X, Y)

predictions = vclf.predict(test_X)

In [61]:

labels = pd.read_csv(r'../data/1/label.csv')['Survived'].tolist()

In [62]:

methods = ["random forest", "decision tree", "support vector machine"]
reses = [rfc_test, dtc_test, svm_test]
for method, res in zip(methods, reses):
    print("Accuracy: %0.4f [%s]" % (score(np.squeeze(res), labels), method))
Accuracy: 0.8780 [random forest]
Accuracy: 0.6603 [decision tree]
Accuracy: 1.0000 [support vector machine]

In [63]:

print("Accuracy: %0.4f [%s]" % (score(predictions, labels), "Ensemble model"))
Accuracy: 1.0000 [Ensemble model]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1307145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安科瑞出席宁波市建筑电气2023年年会-安科瑞 蒋静

12月1日&#xff0c;宁波市建筑电气2023年年会在宁波市海曙天港禧悦酒店成功举办。作为推动宁波市建筑电气行业技术发展的专业交流会&#xff0c;吸引了建筑电气行业领导、专家、设计师、厂家等300多名代表参会。期间&#xff0c;安科瑞电气股份有限公司携智能楼宇、智慧校园、…

HTML中表格的语法及使用(详解)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍HTML中表格的语法及详细使用以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可以在评论区留…

骨传导耳机十大品牌排行榜,骨传导耳机品牌排名哪个好

骨传导蓝牙耳机的使用越来越广泛&#xff0c;无论是在户外运动还是在办公室工作&#xff0c;它都能为你带来自由的音乐体验。在本文中&#xff0c;我们将为你介绍十款TOP级骨传导蓝牙耳机&#xff0c;这些品牌在市场上拥有良好的口碑和广泛的使用者。通过本下面的选购指南&…

Buck电路 (PWM实现与闭环反馈) 电力系统仿真

Buck电路 &#xff08;PWM实现与闭环反馈&#xff09; Buck电路是降压型的DC-DC变换器。 三角波&#xff1a; 闭环控制怎么实现呢&#xff1f; 比例积分微分控制&#xff08;proportional-integral-derivative control&#xff09;&#xff0c;简称PID控制&#xff0c;是最早…

祝贺!2023美丽汉字小达人市级比赛和区级自由报名获奖名单发布

昨天&#xff0c;汉字小达人的主办方《中文自修》杂志社在官网发布了两个公示&#xff1a;《“中文自修杯”第十届上海市小学生“美丽汉字小达人”市级活动获奖名单公示》、《“中文自修杯”第十届上海市小学生“美丽汉字小达人”区级活动“自由报名”获奖名单公示》。 这两份名…

mybatis查询结果resultMap映射vo源码分析

概述 mybatis是一个常用的持久层框架&#xff1b;通常搭配mysql使用&#xff1b; 在将查询结果映射成一个复杂vo的时候&#xff0c;通常会用到resultMap&#xff0c;在其中嵌套association和collection等操作&#xff1b;将一个复杂查询拆分成简单查询&#xff1b; 在vo中的变…

「玩转 TableAgent 数据智能分析」实战数据分析演练

文章目录 前言TableAgent 功能亮点人人都是数据分析师融合创新应用的新成果 TableAgent 使用介绍登陆功能介绍申请认证 实战数据集分析一导入 CSV 文件数据发起提问TableAgent 应答结果贴切的服务推荐问题提问 实战数据集分析二分析结果分析哪个城市的未来人口最多 总结 TableA…

proteus元件合集(一)

LCD LM018L​​ 绿色的LCD寻找方法&#xff1a; 直流电压源 直流电压源寻找方法&#xff1a; 滑动变阻器 滑动变阻器寻找方法&#xff1a; 注意&#xff1a;它出来之后会自动出现那两个红色的。那是电源。

C#基础面试题集

C#基础 1. 简述值类型和引用类型有什么区别2. C# String类型比 stringBuilder 类型的优势是什么?3.面向对象的三大特点4.请简述private&#xff0c;public&#xff0c;protected&#xff0c;internal的区别5.结构体和类6.请描述Interface与抽象类之间的不同7.在类的构造函数前…

虚幻学习笔记9—C++代码变量与蓝图的通信

一、前言 C代码中通过关键字“UPROPERTY”来讲所需要的变量、方法或枚举反射暴露给蓝图&#xff0c;实现C和蓝图之间的通信。所有实现的变量都在一个名为“MyPawn1”类中&#xff0c;同时提到的蓝图是根据这个类创建的。同时这个Pawn类为场景中的默认Pawa类。 图1.1.1 文中提到…

L1-039:古风排版

题目描述 中国的古人写文字&#xff0c;是从右向左竖向排版的。本题就请你编写程序&#xff0c;把一段文字按古风排版。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;<100&#xff09;&#xff0c;是每一列的字符数。第二行给出一个长度不超过1000的非空字…

量化交易与人工智能:技术的交叉引发金融市场的变革

量化交易&#xff08;Quantitative Trading&#xff09;是利用数学模型和统计分析来进行投资决策的一种交易策略。而人工智能技术的快速发展为量化交易带来了全新的机遇和挑战。本文将探讨人工智能在量化交易领域的应用及其对金融市场的变革。 在传统的投资交易中&#xff0c;决…

Java连接数据库的各种细节错误(细节篇)

目录 前后端联调&#xff08;传输文件&#xff09; ClassNotFoundException: SQLException: SQL语法错误: 数据库连接问题: 驱动问题: 资源泄露: 并发问题: 超时问题: 其他库冲突: 配置问题: 网络问题: SSL/TLS问题: 数据库权限问题: 驱动不兼容: 其他未知错误…

C语言学习day02:数据结构、变量和常量、标识符

数据类型&#xff1a; 常量和变量以及宏文件注意、占位符拓展&#xff1a; #include<stdio.h> 宏定义常量 没有和; #define PI 3.14159圆的面积 spi * r * r 圆的周长 lpi * 2 * r int main() {常量piconst数据类型 常量名值const float pi 3.14159;在定义局部变量可以…

Kyligence 荣登甲子光年 2023 AIGC 技术应用领域最具商业潜力榜

近日&#xff0c;「2023甲子引力年终盛典致追风赶月的你」在北京成功举办。作为中国科技产业智库&#xff0c;「甲子光年」在年终盛典现场颁布多项榜单&#xff0c;旨在表彰2023年度在科技产业各细分赛道上拥有核心技术实力&#xff0c;并在商业化上取得卓越成绩的优秀科技企业…

亚马逊云科技:大语言模型的前沿探索与应用革新

导言&#xff1a; 近年来&#xff0c;随着科技的飞速发展&#xff0c;大语言模型成为人工智能领域的一颗璀璨明珠。在这个信息爆炸的时代&#xff0c;大语言模型以其强大的自学习能力和广泛的应用领域引起了广泛关注。作为亚马逊云科技的前沿技术之一&#xff0c;本文将深入探…

Python房价分析(三)支持向量机SVM分类模型

目录 1 数据预处理 1.1 房价数据介绍 1.2 数据预处理 2 SVM模型 2.1 模型概述 2.2 核函数选择 2.3 建模步骤 2.4 参数搜索过程 3模型评估 3.1 模型评估结果 3.2 混淆矩阵 3.3 绘制房价类别三分类的ROC曲线和AUC数值 3.4 模型比较 总结 往期精彩内容&#xff1a; …

进程线程。

1> 使用有名管道&#xff0c;完成两个进程的相互通信 #include <myhead.h> int main(int argc, const char *argv[]) {if(argc!5){puts("输入错误请重新输入");return -1;}pid_t pid-1;pidfork();if(pid>0){int wfd-1;if((wfdopen(argv[1],O_WRONLY))-1…

PPT插件-好用的插件-插入媒体-大珩助手

批量媒体 包含批量视频、批量音频、批量图片&#xff0c;可实现从光标所在的位置开始&#xff0c;每页插入一个视频、一个音频、一张图片&#xff0c;且图片和视频的尺寸与当前幻灯片尺寸一致 插入文本 包含黑字无底、白字红底、白字黛底、白字绿底、白字蓝底预设一键文本&am…

springboot房屋房产房管家中介服务系统+java-ssm

随着房地产市场的快速发展&#xff0c;中国经济飞速发展&#xff0c;社会城市化建设的脚步不断加快&#xff0c;社会城市化的规模也在不断扩大&#xff0c;房屋中介逐渐成为当今社会生活的重要部分&#xff0c;房屋中介的市场竞争也日益加剧&#xff0c;房屋中介的管理与服务成…