精华内容
下载资源
问答
  • 采用“数量化理论(Ⅰ)”的方法分析立地因子、苗木质量因子和造林技术因子与兴安落叶松造林成活率的关系,结果表明:造林技术和苗木质量是影响造林成活的主导因子。文中还提出了不同条件下的造林成活率预测方程,并编制...
  • 南美对虾在国内的存活率,叶仁杰,陈让珠,存活率是衡量水产养殖风险的主要指标,但一般养户众说不一。本研究目的是要找出国内养殖南美对虾的存活率,作为基准,以供行内人
  • ["Pclass", "Sex", "Fare", "Title"] alg = RandomForestClassifier(random_state=1, n_estimators=50, min_samples_split=8, min_samples_leaf=4) #通过使用不同的预测模型,进行投票的方式提高准确,当然差别要...
    #通过pandas导入数据
    import pandas as pd
    titanic=pd.read_csv("titanic_train.csv")
    print(titanic.head(5))
    
    #因为Age项里有空的数据,这里使用平均值去填补fillna
    titanic["Age"]=titanic["Age"].fillna(titanic["Age"].median())
    print(titanic.describe())
    
    #将一些字符型变为数值方便处理
    print(titanic["Sex"].unique())
    titanic.loc[titanic["Sex"]=="meal","Sex"]=0
    titanic.loc[titanic["Sex"]=="femeal","Sex"]=1
    print(titanic["Embarked"].unique())
    titanic["Embarked"]=titanic["Embarked"].fillna('S')
    titanic.loc[titanic["Embarked"]=="S","Embarked"]=0
    titanic.loc[titanic["Embarked"]=="C","Embarked"]=1
    titanic.loc[titanic["Embarked"]=="Q","Embarked"]=2
    
    #线性回归训练
    from sklearn.linear_model import LinearRegression
    from sklearn.cross_validation import KFold
    #分类的特征
    predictors=["Pclass","Sex","Age","SibSp","Parch","Fare","Embarked"]
    alg=LinearRegression()#线性回归的模型
    kf=KFold(titanic.shape[0],n_flods=3,random_state=1)#交叉验证,不停切换val和train的小部分
    predictions=[]
    for train,test in kf:
        train_preditors=(titanic[predictors].iloc[train,:])#训练所使用的数据
        train_target=titanic["Survived"].iloc[train]#训练所使用的标签
        alg.fit(train_preditors,train_target)#用数据去fit线性回归的模型
        test_predictions=alg.predict(titanic[predictors].iloc[test,:])
        predictions.append(test_predictions)
    
    #需要0或者1,以上为小数,要转换一下
    import numpy as np
    predictions=np.concatenate(predictions,axis=0)
    predictions[predictors>.5]=1
    predictions[predictors<.5]=0
    #判断是否和标签一样,一样就是1,不一样就是0
    accuracy=len(predictions[predictions==titanic["Survived"]])/len(predictions)
    print(accuracy)
    
    #逻辑回归训练
    from sklearn import cross_validation
    from sklearn.linear_model import LogisticRegression
    # Initialize our algorithm
    alg = LogisticRegression(random_state=1)
    # Compute the accuracy score for all the cross validation folds.  (much simpler than what we did before!)
    scores = cross_validation.cross_val_score(alg, titanic[predictors], titanic["Survived"], cv=3)
    # Take the mean of the scores (because we have one for each fold)
    print(scores.mean())
    
    #对测试集进行预处理
    titanic_test = pandas.read_csv("test.csv")
    titanic_test["Age"] = titanic_test["Age"].fillna(titanic["Age"].median())
    titanic_test["Fare"] = titanic_test["Fare"].fillna(titanic_test["Fare"].median())
    titanic_test.loc[titanic_test["Sex"] == "male", "Sex"] = 0 
    titanic_test.loc[titanic_test["Sex"] == "female", "Sex"] = 1
    titanic_test["Embarked"] = titanic_test["Embarked"].fillna("S")
    
    titanic_test.loc[titanic_test["Embarked"] == "S", "Embarked"] = 0
    titanic_test.loc[titanic_test["Embarked"] == "C", "Embarked"] = 1
    titanic_test.loc[titanic_test["Embarked"] == "Q", "Embarked"] = 2
    
    #使用随机森林进行,优先选择的模型,集成了很多基础模型。
    #随机抽取特征进行训练。
    from sklearn import cross_validation
    from sklearn.ensemble import RandomForestClassifier
    
    predictors=["Pclass","Sex","Age","SibSp","Parch","Fare","Embarked"]
    #参数选取,10棵树,最小切分点为2,叶子结点最小为1.决定了树的高度,
    alg=RandomForestClassifier(random_state=1,n_estimators=10,min_samples_split=2,min_samples_leaf=1)
    kf=cross_validation.KFold(titanic.shape[0],n_flods=3,random_state=1)
    scores=cross_validation.cross_val_score(alg,titanic[predictors],titanic["Survived"],cv=kf)
    print(score.mean())
    
    #修改参数
    alg=RandomForestClassifier(random_state=1,n_estimators=50,min_samples_split=4,min_samples_leaf=2)
    kf=cross_validation.KFold(titanic.shape[0],n_flods=3,random_state=1)
    scores=cross_validation.cross_val_score(alg,titanic[predictors],titanic["Survived"],cv=kf)
    print(score.mean())
    
    #数据特征判断,家庭成员和名字长度
    # Generating a familysize column
    titanic["FamilySize"] = titanic["SibSp"] + titanic["Parch"]
    # The .apply method generates a new series
    titanic["NameLength"] = titanic["Name"].apply(lambda x: len(x))
    
    #名字里也有特征,进行提取
    import re
    # A function to get the title from a name.
    def get_title(name):
        # Use a regular expression to search for a title.  Titles always consist of capital and lowercase letters, and end with a period.
        title_search = re.search(' ([A-Za-z]+)\.', name)
        # If the title exists, extract and return it.
        if title_search:
            return title_search.group(1)
        return ""
    
    # Get all the titles and print how often each one occurs.
    titles = titanic["Name"].apply(get_title)
    print(pd.value_counts(titles))
    
    # Map each title to an integer.  Some titles are very rare, and are compressed into the same codes as other titles.
    title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Dr": 5, "Rev": 6, "Major": 7, "Col": 7, "Mlle": 8, "Mme": 8, "Don": 9, "Lady": 10, "Countess": 10, "Jonkheer": 10, "Sir": 9, "Capt": 7, "Ms": 2}
    for k,v in title_mapping.items():
        titles[titles == k] = v
    
    # Verify that we converted everything.
    print(pd.value_counts(titles))
    
    # Add in the title column.
    titanic["Title"] = titles
    
    #特征的重要程度提取,这里原理是故意对其中一个变量错误抖动,看结果变化大不大,如果大,为重要特征。
    import numpy as np
    from sklearn.feature_selection import SelectKBest, f_classif
    import matplotlib.pyplot as plt
    predictors = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked", "FamilySize", "Title", "NameLength"]
    
    # Perform feature selection
    selector = SelectKBest(f_classif, k=5)
    selector.fit(titanic[predictors], titanic["Survived"])
    
    # Get the raw p-values for each feature, and transform from p-values into scores
    scores = -np.log10(selector.pvalues_)
    
    # Plot the scores.  See how "Pclass", "Sex", "Title", and "Fare" are the best?
    plt.bar(range(len(predictors)), scores)
    plt.xticks(range(len(predictors)), predictors, rotation='vertical')
    plt.show()
    
    # Pick only the four best features.
    predictors = ["Pclass", "Sex", "Fare", "Title"]
    
    alg = RandomForestClassifier(random_state=1, n_estimators=50, min_samples_split=8, min_samples_leaf=4)
    
    #通过使用不同的预测模型,进行投票的方式提高准确率,当然差别要大一点
    from sklearn.ensemble import GradientBoostingClassifier
    import numpy as np
    
    # The algorithms we want to ensemble.
    # We're using the more linear predictors for the logistic regression, and everything with the gradient boosting classifier.
    algorithms = [
        [GradientBoostingClassifier(random_state=1, n_estimators=25, max_depth=3), ["Pclass", "Sex", "Age", "Fare", "Embarked", "FamilySize", "Title",]],
        [LogisticRegression(random_state=1), ["Pclass", "Sex", "Fare", "FamilySize", "Title", "Age", "Embarked"]]
    ]
    
    # Initialize the cross validation folds
    kf = KFold(titanic.shape[0], n_folds=3, random_state=1)
    
    predictions = []
    for train, test in kf:
        train_target = titanic["Survived"].iloc[train]
        full_test_predictions = []
        # Make predictions for each algorithm on each fold
        for alg, predictors in algorithms:
            # Fit the algorithm on the training data.
            alg.fit(titanic[predictors].iloc[train,:], train_target)
            # Select and predict on the test fold.  
            # The .astype(float) is necessary to convert the dataframe to all floats and avoid an sklearn error.
            test_predictions = alg.predict_proba(titanic[predictors].iloc[test,:].astype(float))[:,1]
            full_test_predictions.append(test_predictions)
        # Use a simple ensembling scheme -- just average the predictions to get the final classification.
        test_predictions = (full_test_predictions[0] + full_test_predictions[1]) / 2
        # Any value over .5 is assumed to be a 1 prediction, and below .5 is a 0 prediction.
        test_predictions[test_predictions <= .5] = 0
        test_predictions[test_predictions > .5] = 1
        predictions.append(test_predictions)
    
    # Put all the predictions together into one array.
    predictions = np.concatenate(predictions, axis=0)
    
    # Compute accuracy by comparing to the training data.
    accuracy = sum(predictions[predictions == titanic["Survived"]]) / len(predictions)
    print(accuracy)
    
    #对不同的模型,设置权重。
    predictors = ["Pclass", "Sex", "Age", "Fare", "Embarked", "FamilySize", "Title"]
    
    algorithms = [
        [GradientBoostingClassifier(random_state=1, n_estimators=25, max_depth=3), predictors],
        [LogisticRegression(random_state=1), ["Pclass", "Sex", "Fare", "FamilySize", "Title", "Age", "Embarked"]]
    ]
    
    full_predictions = []
    for alg, predictors in algorithms:
        # Fit the algorithm using the full training data.
        alg.fit(titanic[predictors], titanic["Survived"])
        # Predict using the test dataset.  We have to convert all the columns to floats to avoid an error.
        predictions = alg.predict_proba(titanic_test[predictors].astype(float))[:,1]
        full_predictions.append(predictions)
    
    # The gradient boosting classifier generates better predictions, so we weight it higher.
    predictions = (full_predictions[0] * 3 + full_predictions[1]) / 4
    predictions
    
    展开全文
  • 三种草料秸秆覆盖管理措施:在夏季结束时进行无覆盖物(CK),干重覆盖物(MC)和塑料覆盖物(PC)的评估,以评估冬季的耐寒性和种质成活率。 仲夏时节从草料中获取光合作用。 结果表明,PG1品种的干物质产量(67.0...
  • 采用随机区组法设计试验方案,研究了不同质量浓度的葡萄糖对中华鳖成活率与产蛋率的影响,结果表明:越冬前连续两次给亲鳖注射质量浓度为 25 g/ 100 mL的葡萄糖对于提高亲鳖越冬成活率与产蛋率有明显作用,成活率达到96%...
  • 取舟形无齿蚌成熟钩介幼虫暴露于一系列pH(3.0~12.0)中6d,每隔24h检测不同pH对其存活率的影响。结果表明:钩介幼虫适合在中性及弱碱性条件下生存。在同一时间内,pH7.0中的钩介幼虫存活率最高,暴露5d后存活率仍达70%。...
  • 分别以N2、高纯空气[V(O2): V(N2)=21∶79]和CO2为加压介质,研究高压条件下蓝色犁头霉孢子存活率的变化情况。在3种不同加压介质下,蓝色犁头霉孢子存活率显示出相同的变化规律,随压力升高,孢子存活率逐步降低...
  • 为提高亚麻多倍体诱导变异试管苗的移栽成活率,以形态变异亚麻试管苗为材料,系统研究了培养室不同炼苗时间,不同温度,不同根量,培养基质,温室,室外不同炼苗时间对形态变异试管苗移栽成活率的影响.结果表明:根数为6~8根...
  • 应用三即时的饱水土培技术,研究了影响沙棘扦插成活率的本质性因素,探讨其与扦插成活率之间 的关系及规律,从而为提高沙棘扦插成活率提供理论基础及技术支撑。结果表明,树势强、抗逆性强的品种扦插 成活率较高,蒙俄杂...
  • 为了解低盐胁迫对黄鳍棘鲷(Acanthopagrus latus)养殖所产生的影响,采用快速或缓慢2种梯度淡化方法,研究盐度由20淡化至10,5甚至淡水后对黄鳍棘鲷幼鱼的存活率、鳃ATP酶和肝脏抗氧化酶的影响.结果表明:1)除了淡水...
  • 食品对于人类而言拥有着获取营养和品味美食两个功能,而提高母猪繁殖率提高仔猪成活率的措施所蕴含的知识...该文档为提高母猪繁殖率提高仔猪成活率的措施,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以...
  • 此篇,我们来分享一个设计到生物实验的重要制图,就是细胞的存活率柱状图。 一、直方图绘制 1)准备数据。 一般,我们使用MTT法测细胞的生存率时,需要测试多个浓度下(此篇设定了对照组0和浓度分别为31.25、...

           此篇,我们来分享一个设计到生物实验的重要制图,就是细胞的存活率柱状图。

     

    一、柱状图绘制

           1)准备数据。

           一般,我们使用MTT法测细胞的生存率时,需要测试多个浓度下(此篇设定了对照组0和浓度分别为31.25、62.5、125、250、500 μg/mL的细胞)的细胞存活率,而为了提高检测准确性和稳定性,每个浓度的细胞在96孔板中要测三个孔。而酶标仪的原理是通过检测穿过每个孔的单色光的光信号变化,并经过一系列的算法还原出一个光密度值OD,来体现单个孔中的细胞相对数量。因而,下图中我们自主设定了六个浓度的细胞,且每个浓度有三个孔的光密度值。

           2)计算均值和标准差。

           因为我们最后的柱状图是以每个浓度下三个数据的均值为主制图,而三个数据的标准差作为误差标记出每个柱的误差棒,因而,需要计算每个浓度下数据的均值和标准差。那么,Origin作为一个数据分析和绘图软件,当然为我们配备了这样的功能。如下图所示步骤操作,再选定三个Y列之后,打开描述性统计对话框。

           由于已经提前选好了数据范围,所以直接点击确定即可。

           如下图所示,点击确定后,新产生的两列数据就是前面每个浓度下数据的均值和标准差。

           3)尝试制图。

           如下图所示,在做柱状图前先更改下均值的几个名称。

           接着,选中A(X)、Mean(Y)、SD(yEr?这三列之后,点击Plot——》Column/Bar/Pie——》Column即可绘制柱状图。

           如下图所示,柱状图的效果不是很理想,因为每个柱子位于实际坐标位置因而间距不均匀。

           4)替换横坐标数值。

           现在,重新添加三列数据,第一列为X属性,数据为1到6,第二列和第三了分别为复制前面的均值和标准差。注意,第二列的属性要设置为Y,而第三列要设置为Y Error。

           同时框选新添加的三列数据,然后绘制Column柱状图。可以看到,现在各柱间距是相等的,然后,我们准备将当前的横坐标替换为0 31.25 62.5 125 250。

           双击横坐标值,会自动弹出到Tick Labels分页,在Display子分页中,将Type类型改为Tick-indexed dataset坐标索引数据集,然后在Dataset Name中选择表格第一列,即A"Concentation"。

           确定之后,如下图所示,横坐标已经替换为了正确的细胞浓度。

     

    二、柱状图优化

           1)更改柱体颜色。

           这里必须双击柱体的边框,才能打开绘制细节的修改面板。在Pattern图案分页下,主要有两种修改对象,一个是Border边框,一个是Fill填充。看到这里,熟悉Office的同学应该能感觉到,这边框和填充是Word和PPT中对图案的常用修改模式。下图中,我们将柱体的填充颜色改为了红色。而对于其他的可改项,大家可自行尝试。

           2)更改柱间距。

           将制图细节面板切换到Spacing空间分页,可修改柱间距(其实是ErrorBar误差棒的间距,因为棒在柱的中间,所以用Gap Between Bars描述起来更准确)。如图所示,我们将原先默认的20%增加到了40%,可以看到柱间距明显增大了一些,看起来更舒适。

           3)可更改Error Bar。

           双击图中的Error Bar可打开对误差棒的修改面板,或是将Layer1中的选项切换到第二个,也可打开此面板。大家可自行尝试对Error Bar的一些修改。

           4)单独修改柱体填充颜色。

           首先 ,要改变单个柱体的填充颜色,就要先单独将其选中。对于Column类型的图,想要单独选中,需要按住ctrl键,然后鼠标点击某个柱体才行。

           接着,再双击已被选中的柱体,即可打开对其细节单独修改的面板。如下图所示,细节面板左侧的层次图中多出了一个2的数据,这正是我们所单独选取的柱体。而分页选项中,已经缺少了Spacing,这是理所应当的,因为对于单个物体谈何相距。下图中,我们已将第二个柱体的颜色改为了橙色。

     

    三、柱状图归一化。

           还有一件事没有完成,即细胞活性的纵坐标单位是百分比,因此,对比组的细胞生存率应该调整为100%,相应的,其他列的数据也要以相同倍数调变。

           1)打开Set Values面板。

           选中需要改变数据的一列,然后右键,再弹出的选项列表中选择Set Column Values,即设置列值。

           2)填写函数脚本。

           将会话框中的函数补全为Col(F)/0.95*100,点击Apply后,即可将对照组的细胞存活率调整为100%,而其他不同浓度的细胞存活率也以相应的倍数放大。

           同样的,Error Bar中的数据也要以相同的倍数改变 。此时,注意所写函数要与实际列相对应,即Col(G)=Col(G)/0.95*100。

           此时,再看柱状图,结果便不一样了(改变数值后,原图可能会容纳不下新的柱体,因此需要适当调整纵坐标范围)。另外,从下图中也可看出,Book的第四个参数F(x)=也付出水面了,这里是显示我们补写函数的地方。

     

    四、总结

           回顾,此篇我们用到的功能有:描述性统计辅助计算均值和标准差、柱状图制图、横坐标数值替换、更改柱体颜色、更改柱间距、更改误差棒、单独修改柱体颜色、函数脚本更改列值。

     

          【无机纳米材料科研制图——OriginLab 0201】Origin光谱图、曲线图绘制

          【无机纳米材料科研制图——OriginLab 0202】Origin制图优化与格式复制

          【无机纳米材料科研制图——OriginLab 0203】Origin线条整体修改与单独修改及图片导出

          【无机纳米材料科研制图——OriginLab 0204】Origin细胞存活率柱状图绘制

          【无机纳米材料科研制图——OriginLab 0205】Origin绘制BET氮气吸附/脱附曲线及孔径分布图

          【无机纳米材料科研制图——OriginLab 0206】Origin绘制X射线衍射XRD堆叠图

          【无机纳米材料科研制图——OriginLab 0207】Origin拉平XRD基线

          【无机纳米材料科研制图——OriginLab 0208】Origin拟合SERS拉曼光谱

          【无机纳米材料科研制图——OriginLab 0209】Origin散点图线性拟合与非线性拟合

          【无机纳米材料科研制图——OriginLab 0210】Origin多组柱状图、3D柱状图及3D散点图绘制

      

           欢迎报考Lv老师课题组:

           主页

           论文成果

     

           

     

     

     

    展开全文
  • 为了提高北美香柏在沈阳地区的扦插成活率,试验以北美香柏一、二年生的插穗为试材,分别采用不同浓度的IBA、NAA及ABT生根粉浸泡插穗,以清水作对照,并分别在河沙、草炭、炉渣、园土等基质上进行扦插试验。...
  • 普通肉食螨在16~32℃温度范围内,各螨态的发育历...在16~24℃之间,从卵发育到成螨的世代存活率随温度的升高而增高,在24~32℃之间,存活率随温度的升高而降低,存活率在24℃最高,为81.3%,在32℃时最低,为17.1%。
  • 水平沟可使太阳辐射比阳坡自然坡减弱22.6%,降低地温2.9—3.6℃,减少地表蒸发耗热量85%,提高土壤湿度4.6%,接近于阴坡小气候生态坏境,从而使造林成活率达到85%以上,保存率93.8%,苗木生长量比常规造林增长57.6%。...
  • # 使用countplot 对'存活'的一个标签进行计数绘图,使用x表示横轴上的图,y表示纵轴 上的图 sns . set_style ( 'whitegrid' ) sns . countplot ( x = 'Survived' , data = train ) 4. countplot和group查看...

    1. 通过热力图的方式来查看缺失的数据

    sns.heatmap(train.isnull(), yticklabels=False, cbar=False, cmap='viridis')
    

    tip:对于有些数据集中可能不是显式的存在缺失值,而是把缺失值替换成了特殊的字符,这种情况的话可以先将特殊字符替换为np.nan,再用isnull()函数。

    2. 查看离散变量和连续变量的属性

    # 统计离散变量的属性:离散变量为字符串,属性为'object'
    train.describe(include=['O'])
    # 统计连续变量的属性
    train.describe()
    

    3. countplot查看存活的人与未存活人的比例

    # 设置白色网格为主题
    # 使用countplot 对'存活'的一个标签进行计数绘图,使用x表示横轴上的图,y表示纵轴 上的图
    sns.set_style('whitegrid')
    sns.countplot(x='Survived',data=train)
    

    4. countplot和group查看存活的人与性别的关系

    # 设置白色网格为主题
    # 使用countplot 对'存活'和'性别'两个标签进行计数绘图
    sns.set_style('whitegrid')
    sns.countplot(x='Survived',hue='Sex',data=train)
    
    train[['Sex', 'Survived']].groupby(['Sex'], as_index=False).mean().sort_values(by='Survived', ascending=False)
    
    

    5. countplot和group查看存活的人与船舱级别的关系

    sns.set_style('whitegrid')
    sns.countplot(x='Survived', hue='Pclass', data=train)
    
    train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)
    

    6. distplot查看年龄的分布

    # 根据开始的空值判断中,可以得出age中有空值,所以需要进行drop
    
    # 通过displot绘制直方图的观测值的单变量分布:纵坐标表示的是比率
    # kde为高斯核函数,bins为直方图的宽
    sns.distplot(train['Age'].dropna(), kde=False, bins=30)
    

    7. countplot和group查看乘船人的家族关系以及和存活之间的关系

    sns.countplot(x='SibSp', data=train)
    
    train[['SibSp', 'Survived']].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False)
    

    8. hist查看乘客的票价分布

    # 当然这里也可以用seaborn的displot进行绘制,但是displot的纵坐标是比率,hist的纵坐标是实际个数count;
    # figsize调整画布大小
    train['Fare'].hist(color='green', bins=30, figsize=(8,4))
    

    对比,hist和distplot直方图分布的区别
    使用hist的直方图分布,纵坐标是count值;
    使用displot的直方图分布,纵坐标是比率radio;

    9. 箱型图查看年龄和船舱等级的分布

    箱型图不仅可以来找出异常值,也可以用来说明样本分布的情况:

    1. 如果箱子比较扁, ,说明分布比较靠拢;
      如果箱子比较长,说明分布比较离散;
    2. 就是判断出箱子图中所处的范围在哪块;
    plt.figure(figsize=(12,7))
    sns.boxplot(x='Pclass', y='Age', data=train)
    

    在这里插入图片描述
    通过箱型图大致可以判断出:三等舱的乘客年龄分布都比较小,一等舱的乘客年龄分布都比较大。

    10. 填补缺失值

    填补缺失值有很多种方法,这里是根据之前的箱型图:三等舱的乘客年龄分布比较小,一等舱的乘客年龄分布比较大。于是来根据船舱的类别填入该类别年龄的平均值。

    # 首先得出各个船舱年龄的平均值
    [train[train['Pclass'] == i]['Age'].mean() for i in range(1,4)]
    
    def infer_age(cols):
        Age = cols[0]
        Pclass = cols[1]
        
        if pd.isnull(Age):
            if Pclass == 1:
                return 37
            elif Pclass == 2:
                return 29
            else:
                return 24
        else:
            return Age
     # 使用apply方法应用函数
     train['Age'] = train[['Age', 'Pclass']].apply(infer_age, axis=0)
    

    11.去除无关的数据列

    # 票号和船舱号是无关的特征,将它们去除掉
    # axis的0轴匹配的是index, 涉及上下运算;1轴匹配的是columns, 涉及左右运算
    train.drop(['Ticket', 'Cabin'], axis=1, inplace=True)
    

    12. 考虑人名的特征,只保留前面的姓氏

    # 通过正则表达式留下.之前的形式
    train['Title'] = train.Name.str.extract('([A-Za-z]+)\.', expand=False)
    

    在这里插入图片描述

    13. 检查下名称是否对应着性别

    pd.crosstab(train['Title'], train['Sex'])
    

    在这里插入图片描述

    14.将不同类的title,根据个数不同进行聚合

    for dataname in [train, test]:
        dataname['Title'] = dataname['Title'].replace(['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', \
                                                'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
        dataname['Title'] = dataname['Title'].replace(['Mlle', 'Ms'], 'Miss')
        dataname['Title'] = dataname['Title'].replace('Mme', 'Mrs')
    
    train[['Title', 'Survived']].groupby(['Title'], as_index=False).mean()
    

    15. 通过map将名称的变量离散值连续化

    title_mapping = {'Mr': 1, 'Miss': 2, 'Mrs': 3, 'Master': 4, 'Rare': 5}
    train['Title'] = train['Title'].map(title_mapping)
    

    16. 对缺失数据进行删除

    # inplace表示在原地操作,不返回对象
    train.dropna(inplace=True)
    

    17. 将性别和上船地点也转变为离散变量

    # drop_first = True的含义是使用k-1个哑变量来表示k个特征
    sex = pd.get_dummies(train['Sex'], drop_first=True)
    embark = pd.get_dummies(train['Embarked'], drop_first=True)
    # 删除原来的离散变量,并将新的哑变量的dataframe与原来的连接
    train.drop(['Sex','Embarked','Name', 'PassengerId'], axis=1, inplace=True)
    train = pd.concat([train, sex, embark], axis=1)
    

    18. 拆分数据集

    拆分数据集进行训练主要是为了防止过拟合的情况。

    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(train.drop('Survived', axis=1), train['Survived'], test_size=0.2, random_state=2019)
    

    19. 模型训练

    展开全文
  • 泰坦尼克号存活率预测--学习笔记数据引入和初步分析csv数据引入和概览初步探索分析***Pclass******Sex******Name******SibSp******Parch****** Embarked ******Fare***可视化分析***Age******Age &amp;amp;amp;...

    泰坦尼克号的沉没是历史上著名的海难事件,当时登船乘客数以千计。他们的个人信息各不相同,生还罹难遭遇各异。虽然,人们对他们的遭遇表示不幸,但是这个灾难也给数据分析和预测提供了比较丰富的数据样品。

    本文的题目描述和数据集源自https://www.kaggle.com/c/titanic,将以给定的训练集数据进行分析,来对预测测试集样品对应的存活几率进行推测。本文为练习笔记总结,问题在所难免,待以后纠正和完善。

    变量说明 :
    Survival(存活与否) 0 = No, 1 = Yes
    Pclass(船票等级) 可以代表社会经济地位,1 = 1st(Upper), 2 = 2nd(Middle), 3 = 3rd(Lower)
    Sex(性别) male/female
    Age(年龄) 年龄小于1的为小数,大于1有小数部分的年龄为估计值
    Sibsp(兄弟姐妹/配偶登船数)
    Parch(父母/子女登船数) 有的孩子是跟保姆旅行,他们的Parch = 0
    ticket(票号)
    Fare(票价)
    Cabin(客舱)
    Embarked(登船港口) C = Cherbourg(法国瑟堡,为第二登船港口), Q = Queenstown(爱尔兰皇后镇,现科夫,为入海港口), S = Southampton(英国南安普顿,为启航港口)

    数据引入和初步分析

    从csv中引入训练集和测试集数据,并对各个字段进行初步分析。

    csv数据引入和概览

    引入所需的库:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    import seaborn as sns
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.linear_model import LogisticRegression
    from sklearn.linear_model import Perceptron
    from sklearn.linear_model import SGDClassifier
    from sklearn.naive_bayes import GaussianNB
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.svm import SVC, LinearSVC
    from sklearn.tree import DecisionTreeClassifier
    
    # 导入训练集和测试集数据
    data_train = pd.read_csv('train.csv')
    data_test = pd.read_csv('test.csv')
    
    # 创建合并数据集,方便分析预测
    data_combined = [data_train, data_test]
    # 打印数据集的主要信息
    for d in data_combined:
        print('表首尾数据:')
        print(d.head())
        print('_'*80)
        print(d.tail())
        print('数值统计信息:')
        print(d.describe())
        print('_'*80)
        print('分类值统计信息:')
        print(d.describe(include=['O']))
        print('_'*80)
        print('表信息:')
        print(d.info())
        print('='*80)
    # 打印Age和Cabin字段缺失值   
    for d in data_combined:
        print('Age缺失值数量为{0}个, 占总比{1}'.format(d.Age.isnull().sum(), d.Age.isnull().sum()/len(d.Age)))
        print('Cabin缺失值数量为{0}个, 占总比{1}'.format(d.Cabin.isnull().sum(), d.Cabin.isnull().sum()/len(d.Cabin)))
        print('_'*60)
    

    这一步打印信息过长,暂且省略,以下是“打印Age和Cabin字段缺失值”语句运行结果:
    Age缺失值数量为177个, 占总比0.19865319865319866
    Cabin缺失值数量为687个, 占总比0.7710437710437711


    Age缺失值数量为86个, 占总比0.20574162679425836
    Cabin缺失值数量为327个, 占总比0.7822966507177034


    • AgeCabin列有大量缺失值
    • 训练集的Embarked和测试集的Fare有少量的缺失值
    • 非数值列NameSexTicketCabinEmbarked等列需要进行数值化以便统计

    初步探索分析

    对各个字段进行初步分析

    Pclass

    # 按照Pclass分类,简单观察与Survived之间的关系
    data_train[['Pclass', 'Survived']].groupby(by=['Pclass'], as_index=False).mean().sort_values(by=['Survived'], ascending=False)
    
    PclassSurvived
    010.629630
    120.472826
    230.242363
    • 表面上看,船票等级越高,存活率越高

    Sex

    # 按照Sex分类,简单观察与Survived之间的关系
    data_train[['Sex', 'Survived']].groupby(by=['Sex'], as_index=False).mean().sort_values(by=['Survived'], ascending=False)
    
    SexSurvived
    0female0.742038
    1male0.188908
    • 表面上看,女性存活率较高

    Name

    Name字段可以获取长度、首字母以及头衔等作为指标
    头衔包括MrMissMaster等,格式为"xxx."
    暂不进行处理分析

    SibSp

    # 按照SibSp分组,简单观察其与存活率之间的关系
    data_train[['SibSp', 'Survived']].groupby(by=['SibSp'], as_index=False).mean().sort_values(by=['Survived'], ascending=False)
    
    SibSpSurvived
    110.535885
    220.464286
    000.345395
    330.250000
    440.166667
    550.000000
    680.000000
    • 兄弟姐妹和配偶同行越少,存活率越高
    • 没有兄弟姐妹和配偶同行的存活率中等偏上

    Parch

    # 按照Parch分组,简单观察其与存活率之间的关系
    data_train[['Parch', 'Survived']].groupby(by=['Parch'], as_index=False).mean().sort_values(by=['Survived'], ascending=False)
    
    ParchSurvived
    330.600000
    110.550847
    220.500000
    000.343658
    550.200000
    440.000000
    660.000000
    • 父母和子女同行人数少(1至3人)比同行人数多(4至6人)的存活率高
    • 无父母和子女同行的存活率中等

    Embarked

    # 按照Embarked分组,简单查看其与存活率之间的关系
    data_train[['Embarked', 'Survived']].groupby(by=['Embarked'], as_index=False).mean().sort_values(by='Survived', ascending=False)
    
    EmbarkedSurvived
    0C0.553571
    1Q0.389610
    2S0.336957
    • 在C港登船的人平均存活率超过一半,S港的船客大约有1/3存活几率,Q港上船的人平均存活几率有不到40%居于中间

    Fare

    # 查看一下Fare > 0的记录的统计信息
    data_train.Fare[data_train.Fare > 0].describe()
    
    count    876.000000
    mean      32.755650
    std       49.936826
    min        4.012500
    25%        7.925000
    50%       14.500000
    75%       31.275000
    max      512.329200
    Name: Fare, dtype: float64
    
    • 票价里有为0的记录,不知道是不是特殊安排的船票,本次分析不算入内
    • 可以观察到票价的差距很大(从4~512左右),可能跟登船港口和船客社会经济地位有关
    • 偏差较大的票价可能会影响统计中的存活人数和比例,可能需要划分为不同范围再统计

    可视化分析

    FacetGrid适用于数据集绘制单变量分布或多变量关系,三个维度为rowcolhue,即横纵轴和颜色

    Age

    # 分别绘制生还和罹难人员的年龄分布
    fg = sns.FacetGrid(data_train, col='Survived', size=3, aspect=1.5)
    fg.map(plt.hist, 'Age', bins=20)
    
    <seaborn.axisgrid.FacetGrid at 0x17137208>
    

    在这里插入图片描述

    • 乘客大部分人为中青年人(15~35)
    • 未成年乘客总体上存活率较高
    • 15~30年龄段的乘客罹难人数非常多

    Age & Sex

    结合Age和Sex观察生还几率

    # 绘制各性别的年龄-生还回归模型图
    generations = [10, 20, 40, 60, 80]
    sns.lmplot('Age', 'Survived',data_train, hue='Sex', x_bins=generations)
    
    D:\Anaconda3\lib\site-packages\scipy\stats\stats.py:1633: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
      return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
    
    <seaborn.axisgrid.FacetGrid at 0x17162048>
    

    在这里插入图片描述

    • 女性比男性存活率高
    • 女性年纪越大越容易存活,男性则相反

    下面是另一个年龄段划分 [15,30,40,80]的图形(可能更明显):
    在这里插入图片描述

    Pclass & Age

    # 分别绘制各船票等级生还和罹难人员年龄分布图
    fg = sns.FacetGrid(data_train, row='Pclass', col='Survived', size=3, aspect=1.5)
    fg.map(plt.hist,'Age', bins=20)
    fg.add_legend()
    
    <seaborn.axisgrid.FacetGrid at 0x174f3128>
    

    在这里插入图片描述

    • 持有1等船票的存活率整体高于50%,2等则大略相当于50%人数也处于中等水平(略低于1等船票),3等对应人数最多且超过一半罹难
    • 持有1和2等船票的年轻乘客基本都存活了
    • Pclass随年龄分布变化适用于模型训练

    下面是各等级船票持有者生还几率随年龄段([15, 30, 40, 80])变化的回归模型图(可能更直观):
    在这里插入图片描述

    • 船票等级越高存活率越高
    • 各船票类别中,年纪越大,存活率越低

    Pclass & Sex & Embarked

    # 绘制各登船港口生还几率与船票等级关系点线图
    fg = sns.FacetGrid(data_train, col='Embarked', size=3, aspect=1.5)
    fg.map(sns.pointplot, 'Pclass', 'Survived', 'Sex', palette='dark')
    fg.add_legend()
    
    D:\Anaconda3\lib\site-packages\scipy\stats\stats.py:1633: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
      return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
    
    <seaborn.axisgrid.FacetGrid at 0x1a812278>
    

    在这里插入图片描述

    • 在S和Q港口登船的女性比男性存活几率高很多,在C港口登船的男性比女性更容易存活

    Embarked & Sex & Fare

    # 绘制各登船地点生还和罹难人员各性别票价柱形图
    fg = sns.FacetGrid(data_train, row='Embarked', col='Survived', size=3, aspect=1.5)
    fg.map(sns.barplot, 'Sex', 'Fare', alpha=0.75, ci=None)
    fg.add_legend()
    
    <seaborn.axisgrid.FacetGrid at 0x1c4c5588>
    

    在这里插入图片描述

    • 船的票价差距很大从大约4到大于512不等,所以本次分析无法用船费统计人数和存活率,后续分析可能需要划分为不同区间
    • 在C和S港口登船的人存活的人比罹难的人平均票价要高得多,而Q港男性存活者的船票略高,女性罹难者的票价略高

    数据整理

    PassengerId

    # PassengerId是用作索引的列,没有统计意义,可以去除掉
    data_train = data_train.drop(['PassengerId'], axis=1)
    
    # Ticket和Cabin为观察到明显的生还几率相关性
    data_train = data_train.drop(['Ticket', 'Cabin'], axis=1)
    data_test = data_test.drop(['Ticket', 'Cabin'], axis=1)
    
    # 打印数据集维度变化
    print('数据集维度变化:\n\t整理前:\n\t\t训练集:\t{0}\t测试集:\t{1}\n\t整理后:\n\t\t训练集:\t{2}\t测试集:\t{3}'.format(data_combined[0].shape, data_combined[1].shape, data_train.shape, data_test.shape))
    # 合并数据集以便统计分析
    data_combined = [data_train, data_test]
    
    数据集维度变化:
    	整理前:
    		训练集:	(891, 12)	测试集:	(418, 11)
    	整理后:
    		训练集:	(891, 9)	测试集:	(418, 9)
    

    Title

    # 从Name字段提取称谓对应的Title字段
    for d in data_combined:
        d['Title'] = d.Name.str.extract(' ([A-Z]\w+)\.', expand=False)
    
    pd.crosstab(data_train['Title'], data_train['Sex'])
    
    Sexfemalemale
    Title
    Capt01
    Col02
    Countess10
    Don01
    Dr16
    Jonkheer01
    Lady10
    Major02
    Master040
    Miss1820
    Mlle20
    Mme10
    Mr0517
    Mrs1250
    Ms10
    Rev06
    Sir01
    • 创建头衔或称谓列Title
    • Title列可以观察人员的大致社会经济地位:

    Title字段对应值的一些基本含义:
    Capt.为船长或上尉、机长或副巡长
    Col.为上校
    Countess.为伯爵夫人或女伯爵
    Don.为意大利、西班牙、葡萄牙、拉丁美洲和菲律宾对男子的尊称(应该有对应的Dona)
    Dr.为医生或博士
    Jonkheer.为荷兰低等贵族
    Lady.为贵族夫人或女贵族
    Major.为陆军少校
    Master.为商船船长、大师、院长等
    Miss.为小姐
    Mlle.为法语Mademoiselle小姐的缩写
    Mme.为法语Madame太太的缩写
    Mr.为先生
    Mrs.为夫人
    Ms.为女士
    Rev.为牧师
    Sir.为爵士

    其中,Mlle、Ms和Miss,Mme和Mrs分别对等,数量较多更具有统计意义;其他的头衔人数很少,不具有太大统计意义,可以归为一类(Don或许应该和Mr对应,Dona和Miss对等)

     # 将Title字段归入对应的值
    for d in data_combined:
        d.Title = d.Title.replace(['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
        d.Title = d.Title.replace('Mlle', 'Miss') 
        d.Title = d.Title.replace('Ms', 'Miss')
        d.Title = d.Title.replace('Mme', 'Mrs')
    # 按照Title字段分类查看与生还几率之间的关系
    data_train[['Title', 'Survived']].groupby(by=['Title'], as_index=False).mean().sort_values(by=['Survived'], ascending=False)
    
    TitleSurvived
    3Mrs0.793651
    1Miss0.702703
    0Master0.575000
    4Rare0.347826
    2Mr0.156673
    • Mrs和Miss代表的女性存活率较高(分别为大约80%和70%)
    • Master代表的有身份地位的男性存活率接近60%
    • Mr代表的普通男性只有略高于15%的存活几率
    • Rare代表的有特殊头衔的乘客存活于中等偏下为不到35%,但是这些人员头衔各异,人数又少,可能意义不大

    将分类值转变为数值以便模型分析和预测

    Title -> 123

    # 将Title转变为数值
    title_map = {'Mr': 1, 'Miss': 2, 'Mrs': 3, 'Master': 4, 'Rare': 5}
    for d in data_combined:
        d.Title = d.Title.map(title_map)
        d.Title = d.Title.fillna(0)
    

    drop Name

    # 删除Name列
    data_train = data_train.drop(['Name'], axis=1)
    data_test = data_test.drop(['Name'], axis=1)
    data_combined = [data_train, data_test]
    

    Sex -> 123

    # 将性别转变为数值
    for d in data_combined:
        d.Sex = d.Sex.map({'male': 1, 'female': 0})
    

    Age & Sex & Pclass

    • Age变量和Sex、Pclass等变量关联
    # 绘制各等级船票持有者各性别的年龄分布图
    fg = sns.FacetGrid(data_train, row='Pclass', col='Sex', size=3, aspect=1.5)
    fg.map(plt.hist, 'Age', alpha=0.75, bins=20)
    fg.add_legend()
    
       <seaborn.axisgrid.FacetGrid at 0x1cca1160>
    

    在这里插入图片描述

    # 预先分配数组用以存放Sex和Pclass各组合对应的年龄
    ages_guessed = np.zeros((2, 3))
    
    # 为各性别各等级船票持有者年龄空值记录赋值为对应的众数
    for d in data_combined:
        for i in range(0, 2):
            for j in range(0, 3):
                age_guessed = d[(d.Sex == i) & (d.Pclass == j+1)].Age.dropna().median()
                #ages_guessed[i, j] = round(age_guessed)
                ages_guessed[i, j] = int(age_guessed + 0.25)
        for i in range(0, 2):
            for j in range(0, 3):
                d.loc[(d.Sex == i) & (d.Pclass == j+1) & d.Age.isnull(), 'Age'] = ages_guessed[i, j]
        d.Age = d.Age.astype(int)
    
    data_train.head()
    
    SurvivedPclassSexAgeSibSpParchFareEmbarkedTitle
    003122107.2500S1
    1110381071.2833C3
    213026007.9250S2
    3110351053.1000S3
    403135008.0500S1

    Band_Age

    # 根据年龄分布情况将其划分为5段
    data_train['Band_Age'] = pd.cut(data_train.Age, 5)
    data_train[['Band_Age', 'Survived']].groupby(by=['Band_Age'], as_index=False).mean().sort_values(by=['Survived'], ascending=False)
    
    Band_AgeSurvived
    0(-0.08, 16.0]0.550000
    3(48.0, 64.0]0.434783
    2(32.0, 48.0]0.412037
    1(16.0, 32.0]0.337374
    4(64.0, 80.0]0.090909
    • 0~16岁的乘客有过半的生存概率
    • 其次为49至64岁、33至48岁、17至32岁的乘客,生存概率在44%至34%左右
    • 65~80岁的乘客,存活概率最低不到10%
    # 分段观察Age变量之后可以删除
    data_train = data_train.drop('Band_Age', axis=1)
    data_combined = [data_train, data_test]
    
    # 根据分段边界划分年龄到各区段
    for d in data_combined:
        d.loc[d.Age <= 16, 'Age'] = 0
        d.loc[(d.Age <= 32) & (d.Age > 16), 'Age'] =1
        d.loc[(d.Age <= 48) & (d.Age > 32), 'Age'] =2
        d.loc[(d.Age <= 64) & (d.Age > 48), 'Age'] =3
        d.loc[(d.Age > 64), 'Age'] =4
    
    # 分别绘制罹难和生还人员各年龄段人数分布图
    fg = sns.FacetGrid(data_train, col='Survived')
    fg.map(plt.hist, 'Age', bins=4)
    
    <seaborn.axisgrid.FacetGrid at 0x1cfb0278>
    

    在这里插入图片描述

    Families

    # Families计算家人数,包括父母、兄弟姐妹、配偶和子女
    for d in data_combined:
        d['Families'] = d.SibSp + d.Parch
        
    data_combined = [data_train, data_test]
    
    data_train.head()
    
    SurvivedPclassSexAgeSibSpParchFareEmbarkedTitleFamilies
    00311107.2500S11
    111021071.2833C31
    21301007.9250S20
    311021053.1000S31
    40312008.0500S10
    data_combined[0].head()
    
    SurvivedPclassSexAgeSibSpParchFareEmbarkedTitleFamilies
    00311107.2500S11
    111021071.2833C31
    21301007.9250S20
    311021053.1000S31
    40312008.0500S10
    # 查看Families和Survived之间的关系
    data_train[['Families', 'Survived']].groupby(by=['Families'], as_index=False).mean().sort_values(by=['Survived'], ascending=False)
    
    FamiliesSurvived
    330.724138
    220.578431
    110.552795
    660.333333
    000.303538
    440.200000
    550.136364
    770.000000
    8100.000000

    登船家人人数少的存活几率超过50%,3至1人几率在72%至55%,依次递减
    登船家人人数适中的存活几率较低,6/4/5人分别在1/3、1/5和3/20左右
    登船家人人数为7和10人的人无人存活
    单独登船的人有不到1/3几率存活,可以创建一个Alone变量

    Alone

    # 创建Alone变量字段
    for d in data_combined:
        d['Alone'] = 0
        d.loc[d.Families == 0, 'Alone'] = 1
    
    data_train.head()
    
    SurvivedPclassSexAgeSibSpParchFareEmbarkedTitleFamiliesAlone
    00311107.2500S110
    111021071.2833C310
    21301007.9250S201
    311021053.1000S310
    40312008.0500S101
    # 按照是否无家人陪同分类查看生存几率
    data_train[['Alone', 'Survived']].groupby(by=['Alone'], as_index=False).mean()
    
    AloneSurvived
    000.505650
    110.303538

    drop SibSp, Parch, Families

    # 将SibSp,Parch和Families列去除,专门分析Alone列
    data_train = data_train.drop(['SibSp', 'Parch', 'Families'], axis=1)
    data_test = data_test.drop(['SibSp', 'Parch', 'Families'], axis=1)
    data_combined = [data_train, data_test]
    
    data_train.head()
    
    SurvivedPclassSexAgeFareEmbarkedTitleAlone
    003117.2500S10
    1110271.2833C30
    213017.9250S21
    3110253.1000S30
    403128.0500S11

    Age x Pclass

    # 创建Age*Pclass字段
    for d in data_combined:
        d['Age*Pclass'] = d.Age * d.Pclass
    data_train[['Age', 'Pclass', 'Age*Pclass', 'Survived']].head()
    
    AgePclassAge*PclassSurvived
    01330
    12121
    21331
    32121
    42360

    Embarked->123

    print('训练集中Embarked空值个数为{}'.format(data_train.Embarked.isnull().sum()))
    
    训练集中Embarked空值个数为2
    
    # 将Embarked少量空值填充为众数
    for d in data_combined:
        d.Embarked = d.Embarked.fillna(data_train.Embarked.dropna().mode()[0])
    
    # 按照登船地点分类查看与存活几率之间的关系
    data_train[['Embarked', 'Survived']].groupby(by=['Embarked'], as_index=False).mean().sort_values(by=['Survived'], ascending=False)
    
    EmbarkedSurvived
    0C0.553571
    1Q0.389610
    2S0.339009
    # 将登船地点转化为数值
    for d in data_combined:
        d.Embarked = d.Embarked.map({'S': 0, 'C': 1, 'Q': 2}).astype(int)
    

    Fare

    print('测试集中Fare空值个数为{}'.format(data_test.Fare.isnull().sum()))
    
    测试集中Fare空值个数为1
    
    # 填充少量Fare的缺失值为众数
    for d in data_combined:
        d.Fare.fillna(d.Fare.dropna().median(), inplace=True)
    

    Band_Fare

    # 分别绘制罹难和生还人员票价分布图
    fg = sns.FacetGrid(data_train, col='Survived', size=3, aspect=1.5)
    fg.map(plt.hist, 'Fare', bins=10)
    
    <seaborn.axisgrid.FacetGrid at 0x1cfddef0>
    

    在这里插入图片描述

    # pandas.qcut按照样品数量等分,pandas.cut等分样品区间
    data_train['Band_Fare'] = pd.qcut(data_train.Fare, 4)
    data_train[['Band_Fare', 'Survived']].groupby(by=['Band_Fare'], as_index=False).mean().sort_values(by=['Survived'], ascending=False)
    
    Band_FareSurvived
    3(31.0, 512.329]0.581081
    2(14.454, 31.0]0.454955
    1(7.91, 14.454]0.303571
    0(-0.001, 7.91]0.197309
    • 区段票价越高,存活率越高

    Fare->123

    # 将票价归入对应的区间并赋值
    for d in data_combined:
        d.loc[(d.Fare <= 7.91), 'Fare'] = 0
        d.loc[(d.Fare > 7.91) & (d.Fare <= 14.454), 'Fare'] = 1
        d.loc[(d.Fare > 14.454) & (d.Fare <= 31.0), 'Fare'] = 2
        d.loc[(d.Fare > 31.0), 'Fare'] = 3
        d.Fare = d.Fare.astype(int)
    

    drop Band_Fare

    data_train = data_train.drop(['Band_Fare'], axis=1)
    
    data_train.head()
    
    SurvivedPclassSexAgeFareEmbarkedTitleAloneAge*Pclass
    0031100103
    1110231302
    2130110213
    3110230302
    4031210116
    data_test.head()
    
    PassengerIdPclassSexAgeFareEmbarkedTitleAloneAge*Pclass
    089231202116
    189330200306
    289421312116
    389531110113
    489630110303

    各变量热力图

    # 简单观察各个变量相关性
    colormap = plt.cm.jet
    plt.figure(figsize=(10, 10))
    sns.heatmap(data_train.astype(float).corr(), linewidth=0.1, vmax=1.0, square=True, cmap=colormap, linecolor='white', annot=True)
    
    <matplotlib.axes._subplots.AxesSubplot at 0x1e359da0>
    

    在这里插入图片描述

    预测模型

    已知训练集包含生存结果,需要将测试集结果归类,是监督学习下进行回归分析
    考虑以下数据集:
    + 逻辑回归(Logistic Regression)
    + k近邻算法(k-Nearest Neighbors)
    + 支持向量机(Support Vector Machines)
    + 朴素贝叶斯分类器(Naive Bayes classifier)
    + 决策树(Decision Tree)
    + 随机森林(Random Forrest)
    + 感知机(Perceptron)
    + 线性支持向量机(Linear SVC)
    + 随机梯度下降法(Stochastic Gradient Descent)
    + 人工神经网络(Artificial neural network)
    + 相关向量机(Relevance Vector Machine)

    x_train = data_train.drop(['Survived'], axis=1)
    y_train = data_train.Survived
    x_test = data_test.drop(['PassengerId'], axis=1)
    x_train.shape, y_train.shape, x_test.shape
    
    ((891, 8), (891,), (418, 8))
    

    逻辑回归

    逻辑回归适用于因变量为分类值(本例中为0或1用以代表是否存活),用以估计的概率衡量因变量和一或多个自变量之间的关系

    # 实例化逻辑回归类对象
    lgrg = LogisticRegression()
    # 以训练集训练模型
    lgrg.fit(x_train, y_train)
    # 以测试集测试模型
    y_predict = lgrg.predict(x_test)
    # 估计一下模型精度
    acc_lgrg = round(lgrg.score(x_train, y_train) * 100, 2)
    print('Logistic Regression:\n\tAccuracy:\t{}'.format(acc_lgrg))
    
    Logistic Regression:
    	Accuracy:	80.92
    
    corr_ftr = pd.DataFrame(x_train.columns)
    corr_ftr.columns = ['Features']
    corr_ftr['Correlations'] = pd.Series(lgrg.coef_[0])
    corr_ftr.sort_values(by=['Correlations'], ascending=False)
    
    FeaturesCorrelations
    5Title0.440642
    6Alone0.377805
    4Embarked0.292706
    3Fare0.061489
    7Age*Pclass-0.138891
    2Age-0.217198
    0Pclass-0.885901
    1Sex-2.119842
    • 负相关中相关性最大为Sex(male=1, female=0),这与最初观察相符,男性存活率比女性低;Pclass也类似
    • 正相关中Title、Alone和Embarked的相关度较高

    支持向量机

    支持向量机是与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。给定一组训练样本,每个标记为属于两类,一个SVM训练算法建立了一个模型,分配新的实例为一类或其他类,使其成为非概率二元线性分类。

    svc = SVC()
    svc.fit(x_train, y_train)
    y_predict = svc.predict(x_test)
    acc_svc = round(svc.score(x_train, y_train) * 100, 2)
    print('Support Vector Machines:\n\tAccuracy:\t{}'.format(acc_svc))
    
    Support Vector Machines:
    	Accuracy:	83.5
    

    k近邻算法

    k临近算法是一个非参数分类和回归方法,这个模型用于预测距离特征空间最近的因变量值

    # 寻找最适合的n_neighbors值
    range_k = range(3, 9)
    list_acc = []
    for k in range_k:
        knc = KNeighborsClassifier(n_neighbors = k)
        knc.fit(x_train, y_train)
        y_predict = knc.predict(x_test)
        list_acc.append(round(knc.score(x_train, y_train) * 100, 2))
    
    plt.plot(range_k, list_acc)
    plt.xlabel('k for KNN')
    plt.ylabel('Accuracy')
    
    Text(0,0.5,'Accuracy')
    

    在这里插入图片描述

    • 最适合的k值为3
    print('k-Nearest Neighbors:\n\tAccuracy:\t{}'.format(list_acc[0]))
    
    k-Nearest Neighbors:
    	Accuracy:	84.06
    

    朴素贝叶斯分类器

    朴素贝叶斯分类器假定样本每个特征与其他特征都不相关,具有高度可伸缩且适用于大数据集

    gnb = GaussianNB()
    gnb.fit(x_train, y_train)
    y_predict = gnb.predict(x_test)
    acc_gnb = round(gnb.score(x_train, y_train) * 100, 2)
    print('Naive Bayes classifier:\n\tAccuracy:\t{}'.format(acc_gnb))
    
    Naive Bayes classifier:
    	Accuracy:	76.88
    

    感知机

    pct = Perceptron()
    pct.fit(x_train, y_train)
    y_predict = pct.predict(x_test)
    acc_pct = round(pct.score(x_train, y_train) * 100, 2)
    print('Perceptron:\n\tAccuracy:\t{}'.format(acc_pct))
    
    Perceptron:
    	Accuracy:	78.45
    
    
    D:\Anaconda3\lib\site-packages\sklearn\linear_model\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.perceptron.Perceptron'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.
      "and default tol will be 1e-3." % type(self), FutureWarning)
    

    线性支持向量机

    线性支持向量机通常最适于文本分类问题,是支持向量机分类器在线性核函数上的应用。

    lsvc = LinearSVC()
    lsvc.fit(x_train, y_train)
    y_predict = lsvc.predict(x_test)
    acc_lsvc = round(lsvc.score(x_train, y_train) * 100, 2)
    print('Linear Supported Vector classifier:\n\tAccuracy:\t{}'.format(acc_lsvc))
    
    Linear Supported Vector classifier:
    	Accuracy:	79.57
    

    随机梯度下降法

    随机梯度下降法在损失函数梯度方向迭代更新权重参数直至取得最小值.不同于传统的梯度下降法,不使用整个数据集计算每次迭代的梯度;相反随机选择单个数据集中的数据点,并沿着该点对应的梯度方向移动。

    sgdc = SGDClassifier()
    sgdc.fit(x_train, y_train)
    y_predict = sgdc.predict(x_test)
    acc_sgdc = round(sgdc.score(x_train, y_train) * 100, 2)
    print('Stochastic Gradient Descent:\n\tAccuracy:\t{}'.format(acc_sgdc))
    
    Stochastic Gradient Descent:
    	Accuracy:	80.36
    
    
    D:\Anaconda3\lib\site-packages\sklearn\linear_model\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.
      "and default tol will be 1e-3." % type(self), FutureWarning)
    

    决策树

    决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别

    dtc = DecisionTreeClassifier()
    dtc.fit(x_train, y_train)
    y_predict = dtc.predict(x_test)
    acc_dtc = round(dtc.score(x_train, y_train) * 100, 2)
    print('Decision Tree:\n\tAccuracy:\t{}'.format(acc_dtc))
    
    Decision Tree:
    	Accuracy:	86.64
    

    随机森林

    随机森林是用于分类和回归等的集成学习方法,它包含多个决策树的分类器,其输出的类别是由个别树输出的类别的众数而定。

    rfc = RandomForestClassifier(n_estimators=10)
    rfc.fit(x_train, y_train)
    y_predict = rfc.predict(x_test)
    acc_rfc = round(rfc.score(x_train, y_train) * 100, 2)
    print('Random Forest classifier:\n\tAccuracy:\t{}'.format(acc_rfc))
    
    Random Forest classifier:
    	Accuracy:	86.64
    
    # 获得特征重要性
    importances_feature = rfc.feature_importances_
    # 排序
    index_sorted = np.argsort(importances_feature)
    positions = np.arange(index_sorted.shape[0])
    
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.figure(figsize=(8, 6))
    plt.barh(positions, importances_feature[index_sorted], align='center')
    plt.yticks(positions, x_train.columns[index_sorted])
    plt.title('变量重要性')
    plt.show()
    

    在这里插入图片描述

    汇总模型预测效果

    acc_model = pd.DataFrame({'model': ['Logistic Regression', 'k-Nearest Neighbors', 'Support Vector Machines',\
                                        'Naive Bayes classifier', 'Decision Tree', 'Random Forrest', 'Perceptron', 'Linear SVC', \
                                        'Stochastic Gradient Descent'], \
                              'acc': [acc_lgrg, list_acc[0], acc_svc, acc_gnb, acc_dtc, acc_rfc, acc_pct, acc_lsvc, acc_sgdc]})
    
    acc_model.sort_values(by=['acc'], ascending=False)
    
    accmodel
    486.64Decision Tree
    586.64Random Forrest
    184.06k-Nearest Neighbors
    283.50Support Vector Machines
    080.92Logistic Regression
    779.57Linear SVC
    678.45Perceptron
    877.10Stochastic Gradient Descent
    376.88Naive Bayes classifier
    index_sorted = np.argsort(acc_model.acc)
    positions = np.arange(index_sorted.shape[0])
    
    plt.figure(figsize=(8, 5))
    plt.barh(positions, acc_model.acc[index_sorted], align='center')
    plt.yticks(positions, acc_model.model[index_sorted])
    plt.title('各模型准确度')
    plt.show()
    

    在这里插入图片描述

    • 决策树和随机森林精确度相同,但是决策树有过拟合训练数据集的倾向,随机森林更优

    留待解决的问题

    1. Ticket,Cabin,Name长度和首字母的影响未列入
    2. 某些分析还可以以更加直观的图形表现(如在同一张图堆叠绘制生还和罹难人员人数随年龄变化的曲线或分布图,可以比较各年龄段生还比例)

    Kaggle上可参考的Solution链接

    https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python
    https://www.kaggle.com/startupsci/titanic-data-science-solutions

    展开全文
  • 基于临界损伤原理,在以损伤应变范围作为金属材料疲劳裂纹萌生寿命控制参量的基础上,推导...以新的FCIL估算模型为基础,建立了含缺口45钢具有给定存活率的疲劳寿命预测公式(PSN曲线公式)。与基于郑氏公式的PSN公式相比,新
  • 以羊软骨为实验材料,用不同体积分数的二甲基亚砜(Me2SO)作为保护剂,在4、-20、-30、-70℃温度下研究对羊软骨细胞存活率和琥珀酸脱氢酶(SDH)活性的影响。实验结果表明,Me2SO对细胞的存活率和SDH 活性的影响受温度和...
  • 结果表明:幼蟹存活率均在盐度25时最高,分别为C195.0%,C290.50%,盐度高于或低于25均有下降趋势,C1和C2在各盐度梯度组累计存活率均差异显著(p<0>0.05);C1至C2和C2至C3在盐度5、30、35时发育时间为120±2 h,而...
  • 经20 d培育,结果表明,投喂轮虫和水蚯蚓的2组泥鳅仔鱼成活率较高,分别为 55.2 3%和53 .89%,显著高于其他3组 ;轮虫组泥鳅仔鱼的生长速度最快,其全长为18 .70 mm,体重为4 . 4429 mg。其次为水蚯蚓组,其全长为13 .45 mm,...
  • 保证树木成活率的措施.pdf
  • 大树移栽后成活率低-.docx
  • 可以明显看出仓位(地位)等级的高低直接影响着幸存,仓位等级越高,获救的可能性越大 二、性别和幸存的关系 df[['Sex','Survived']].groupby('Sex').mean() fig = plt.figure(figsize=(12,6)) ax1 = plt.subplot...
  • 提高犊牛养殖成活率的技术措施 .pdf
  • 提高新生奶犊牛成活率的措施.pdf
  • 安祖花试管苗移栽成活率初探.pdf
  • 采用数量化理论的方法得出影响大兴安岭西林吉地区樟子松造林成活率的因子,按其重要程度依次为:造林技术、苗木质量、土层厚度和腐殖质层厚度.文中还提出了不同条件下的造林成活率预测方程,并制定了数量化因子组合评价...
  • 该文以中国1996年到2004年企业的对外直接投资作为样本,从经济和文化视角分别检验了区位选择对于海外子公司存活率的影响,并对两者进行了整合,进一步分析了文化距离对于经济距离与海外子公司绩效的调节作用。...
  • Accc 10013的草炭吸附制剂直接或间接(将菌剂装入聚丙烯薄膜袋密封)置于有机肥与化肥制成的复混肥料中,于25℃恒温放置30d,采用标准平板菌落计数法测定活细菌数量,研究添加化肥对细菌存活率的影响。实验结果表明...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,516
精华内容 25,406
关键字:

存活率