精华内容
下载资源
问答
  • Python机器学习/数据挖掘项目实战 波士顿房价预测 回归分析

    Python机器学习/数据挖掘项目实战 波士顿房价预测 回归分析

    • 此数据源于美国某经济学杂志上,分析研究波士顿房价( Boston HousePrice)的数据集。
    • 在这个项目中,你将利用马萨诸塞州波士顿郊区的房屋信息数据训练和测试一个模型,并对模型的性能和预测能力进行测试。通过该数据训练后的好的模型可以被用来对房屋做特定预测—尤其是对房屋的价值。对于房地产经纪等人的日常工作来说,这样的预测模型被证明非常有价值。

    数据集说明

    • 数据集中的每一行数据都是对波士顿周边或城镇房价的情况描述,对数据集变量说明如下。

    CRIM: 城镇人均犯罪率
    ZN: 住宅用地所占比例
    INDUS: 城镇中非住宅用地所占比例
    CHAS: 虚拟变量,用于回归分析
    NOX: 环保指数
    RM: 每栋住宅的房间数
    AGE: 1940 年以前建成的自住单位的比例
    DIS: 距离 5 个波士顿的就业中心的加权距离
    RAD: 距离高速公路的便利指数
    TAX: 每一万美元的不动产税率
    PTRATIO: 城镇中的教师学生比例
    B: 城镇中的黑人比例
    LSTAT: 地区中有多少房东属于低收入人群
    MEDV: 自住房屋房价中位数(也就是均价)

    • 原文:print (boston_data['DESCR'])

    Boston House Prices dataset

    ===========================

    Notes

    ------ Data Set Characteristics:

    :Number of Instances: 506 
    
    :Number of Attributes: 13 numeric/categorical predictive
    
    :Median Value (attribute 14) is usually the target
    
    :Attribute Information (in order):
        - CRIM     per capita crime rate by town
        - ZN       proportion of residential land zoned for lots over 25,000 sq.ft.
        - INDUS    proportion of non-retail business acres per town
        - CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
        - NOX      nitric oxides concentration (parts per 10 million)
        - RM       average number of rooms per dwelling
        - AGE      proportion of owner-occupied units built prior to 1940
        - DIS      weighted distances to five Boston employment centres
        - RAD      index of accessibility to radial highways
        - TAX      full-value property-tax rate per $10,000
        - PTRATIO  pupil-teacher ratio by town
        - B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
        - LSTAT    % lower status of the population
        - MEDV     Median value of owner-occupied homes in $1000's
    

    导入库

    from sklearn.datasets import load_boston
    import pandas as pd
    from pandas import Series, DataFrame
    import numpy as np
    from matplotlib import pyplot as plt
    

    载入数据集

    boston_data=load_boston()
    x_data = boston_data.data
    y_data = boston_data.target
    
    names=boston_data.feature_names
    FeaturesNums = 13
    DataNums = len(x_data)
    

    可视化分析

    • 将数据集各个特征可视化
    • 分析相关性后再进行数据处理
    • 处理后继续可视化
    • 可视化再反馈给数据处理
    • 若数据满意,则尝试建模

    以下的数据图是经过筛选后的特征数据所得

    特征与标签关系

    • 观察特征与标签关系
    • 分析特征对于标签的贡献程度
    # 每个Feature和target二维关系图
    plt.subplots(figsize=(20,12))
    for i in range(FeaturesNums):
        plt.subplot(231+i)
        plt.scatter(x_train[:,i],y_train,s=20,color='blueviolet')
        plt.title(names[i])
    plt.show()
    

    特征数据分布

    • 数据分布能够估计数据价值
    • 也能发现异常数据
    plt.subplots(figsize=(20,10))
    for i in range(FeaturesNums):
        plt.subplot(231+i)
        plt.hist(x_data[:,i],color='lightseagreen',width=2)
        plt.xlabel(names[i])
        plt.title(names[i])
    plt.show()
    

    数据处理

    • 导入sklearn中的预处理库
    • 多种处理方式
    from sklearn import preprocessing
    

    清除异常值

    DelList0=[]
    for i in range(DataNums):
        if (y_data[i] >= 49 or y_data[i] <= 1):
            DelList0.append(i)
    DataNums -= len(DelList0)
    x_data = np.delete(x_data,DelList0,axis=0)
    y_data = np.delete(y_data,DelList0,axis=0)
    

    去除无用特征

    DelList1=[]
    for i in range(FeaturesNums):
        if (names[i] == 'ZN' or
            names[i] == 'INDUS' or
            names[i] == 'RAD' or
            names[i] == 'TAX' or
            names[i] == 'CHAS' or
            names[i] == 'NOX' or
            names[i] == 'B' or
            names[i] == 'PTRATIO'):
          DelList1.append(i)
    x_data = np.delete(x_data, DelList1, axis=1)
    names = np.delete(names, DelList1)
    FeaturesNums -= len(DelList1)
    

    归一化

    from sklearn.preprocessing import MinMaxScaler, scale
    nms = MinMaxScaler()
    x_train = nms.fit_transform(x_train)
    x_test  = nms.fit_transform(x_test)
    y_train = nms.fit_transform(y_train.reshape(-1,1))
    y_test  = nms.fit_transform(y_test.reshape(-1,1))
    

    数据分割

    from sklearn.model_selection import train_test_split
    x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3)
    

    训练模型

    • 尝试多种模型
    • 择优选取

    线性回归LinearRegression

    • 用线性回归模型训练
    • 查看MSE和R2得分
    from sklearn.linear_model import LinearRegression
    from sklearn.metrics import mean_squared_error, r2_score
    
    model = LinearRegression()
    model.fit(x_train, y_train)
    y_pred = model.predict(x_test)
    print ("MSE =", mean_squared_error(y_test, y_pred),end='\n\n')
    print ("R2  =", r2_score(y_test, y_pred),end='\n\n')
    

    MSE = 0.013304697805737791
    R2 = 0.44625845284900767

    • 可视化结果
    # 画图
    fig, ax = plt.subplots()
    ax.scatter(y_test, y_pred, c="blue", edgecolors="aqua",s=13)
    ax.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k', lw=2, color='navy')
    ax.set_xlabel('Reality')
    ax.set_ylabel('Prediction')
    plt.show()
    

    SVR模型linear核

    • 用SVR模型linear核模型训练
    • 查看得分
    from sklearn.svm import SVR
    from sklearn.model_selection import cross_val_predict, cross_val_score
    linear_svr = SVR(kernel='linear')
    # linear_svr.fit(x_train, y_train)
    # linear_pred = linear_svr.predict(x_test)
    linear_svr_pred = cross_val_predict(linear_svr, x_train, y_train, cv=5)
    linear_svr_score = cross_val_score(linear_svr, x_train, y_train, cv=5)
    linear_svr_meanscore = linear_svr_score.mean()
    print ("Linear_SVR_Score =",linear_svr_meanscore,end='\n')
    

    Linear_SVR_Score = 0.6497361775614359

    SVR模型poly核

    • 用SVR模型poly核模型训练
    • 查看得分
    from sklearn.svm import SVR
    from sklearn.model_selection import cross_val_predict, cross_val_score
    poly_svr = SVR(kernel='poly')
    poly_svr.fit(x_train, y_train)
    poly_pred = poly_svr.predict(x_test)
    poly_svr_pred = cross_val_predict(poly_svr, x_train, y_train, cv=5)
    poly_svr_score = cross_val_score(poly_svr, x_train, y_train, cv=5)
    poly_svr_meanscore = poly_svr_score.mean()
    print ('\n',"Poly_SVR_Score =",poly_svr_meanscore,end='\n')
    

    Poly_SVR_Score = 0.5383303049258509

    总结

    • 通过数据处理和可视化分析,能够相互反馈筛选有效特征
    • 采用多种模型进行尝试,选择得分最优的模型进行最终的训练
    • 最后,SVR模型linear核效果最佳
    展开全文
  • Python机器学习/数据挖掘项目实战 泰坦尼克号Titanic生存预测 Kaggle入门比赛Titanic : Machine Learning from Disaster 随机森林分类器

    Titanic : Machine Learning from Disaster

    链接:GitHub源代码

    Question

    • 要求你建立一个预测模型来回答这个问题:“什么样的人更有可能生存?”使用乘客数据(如姓名、年龄、性别、社会经济阶层等)。

    一、导入数据包和数据集

    import pandas as pd
    from pandas import Series, DataFrame
    import numpy as np
    from matplotlib import pyplot as plt
    import seaborn as sns
    
    • 重点:在kaggle notebook上时,应该把pd.read_csv("./kaggle/input/titanic/train.csv")引号中第一个'.'去掉
    • 读入训练集和测试及都需要
    train = pd.read_csv("./kaggle/input/titanic/train.csv")
    test = pd.read_csv("./kaggle/input/titanic/test.csv")
    allData = pd.concat([train, test], ignore_index=True)
    # dataNum = train.shape[0]
    # featureNum = train.shape[1]
    train.info()
    

    二、数据总览

    概况

    • 输入train.info()回车可以查看数据集整体信息
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 891 entries, 0 to 890
    Data columns (total 12 columns):
    PassengerId    891 non-null int64
    Survived       891 non-null int64
    Pclass         891 non-null int64
    Name           891 non-null object
    Sex            891 non-null object
    Age            714 non-null float64
    SibSp          891 non-null int64
    Parch          891 non-null int64
    Ticket         891 non-null object
    Fare           891 non-null float64
    Cabin          204 non-null object
    Embarked       889 non-null object
    dtypes: float64(2), int64(5), object(5)
    memory usage: 83.6+ KB
    
    • 输入train.head()可以查看数据样例

    特征

    Variable Definition Key
    survival Survival 0 = No, 1 = Yes
    pclass Ticket class(客舱等级) 1 = 1st, 2 = 2nd, 3 = 3rd
    sex Sex
    Age Age in years
    sibsp # of siblings / spouses aboard the Titanic(旁系亲属)
    parch # of parents / children aboard the Titanic(直系亲属)
    ticket Ticket number
    fare Passenger fare
    cabin Cabin number(客舱编号)
    embarked Port of Embarkation(上船港口编号) C = Cherbourg, Q = Queenstown, S = Southampton

    三、可视化数据分析

    性别特征Sex

    • 女性生存率远高于男性
    # Sex
    sns.countplot('Sex', hue='Survived', data=train)
    plt.show()
    

    等级特征Pclass

    • 乘客等级越高,生存率越高
    # Pclass
    sns.barplot(x='Pclass', y="Survived", data=train)
    plt.show()
    

    家庭成员数量特征

    • FamilySize=Parch+SibSp

    • 家庭成员数量适中,生存率高
    # FamilySize = SibSp + Parch + 1
    allData['FamilySize'] = allData['SibSp'] + allData['Parch'] + 1
    sns.barplot(x='FamilySize', y='Survived', data=allData)
    plt.show()
    

    上船港口特征Embarked

    • 上船港口不同,生存率不同
    # Embarked
    sns.countplot('Embarked', hue='Survived', data=train)
    plt.show()
    

    年龄特征Age

    • 年龄小或者正值壮年生存率高
    # Age
    sns.stripplot(x="Survived", y="Age", data=train, jitter=True)
    plt.show()
    

    • 年龄生存密度
    facet = sns.FacetGrid(train, hue="Survived",aspect=2)
    facet.map(sns.kdeplot,'Age',shade= True)
    facet.set(xlim=(0, train['Age'].max()))
    facet.add_legend()
    plt.xlabel('Age') 
    plt.ylabel('density') 
    plt.show()
    

    • 儿童相对于全年龄段有特殊的生存率
    • 作者将10及以下视为儿童,设置单独标签

    费用特征Fare

    • 费用越高,生存率越高
    # Fare
    sns.stripplot(x="Survived", y="Fare", data=train, jitter=True)
    plt.show()
    

    姓名特征Name

    头衔特征Title

    • 头衔由姓名的前置称谓进行分类
    # Name
    allData['Title'] = allData['Name'].apply(lambda x:x.split(',')[1].split('.')[0].strip())
    pd.crosstab(allData['Title'], allData['Sex'])
    
    • 统计分析
    TitleClassification = {'Officer':['Capt', 'Col', 'Major', 'Dr', 'Rev'],
                           'Royalty':['Don', 'Sir', 'the Countess', 'Dona', 'Lady'],
                           'Mrs':['Mme', 'Ms', 'Mrs'],
                           'Miss':['Mlle', 'Miss'],
                           'Mr':['Mr'],
                           'Master':['Master','Jonkheer']}
    for title in TitleClassification.keys():
        cnt = 0
        for name in TitleClassification[title]:
            cnt += allData.groupby(['Title']).size()[name]
        print (title,':',cnt)
    
    • 设置标签
    TitleClassification = {'Officer':['Capt', 'Col', 'Major', 'Dr', 'Rev'],
                           'Royalty':['Don', 'Sir', 'the Countess', 'Dona', 'Lady'],
                           'Mrs':['Mme', 'Ms', 'Mrs'],
                           'Miss':['Mlle', 'Miss'],
                           'Mr':['Mr'],
                           'Master':['Master','Jonkheer']}
    TitleMap = {}
    for title in TitleClassification.keys():
        TitleMap.update(dict.fromkeys(TitleClassification[title], title))
    allData['Title'] = allData['Title'].map(TitleMap)
    
    • 头衔不同,生存率不同
    sns.barplot(x="Title", y="Survived", data=allData)
    plt.show()
    

    票号特征Ticket

    • 有一定连续座位(存在票号相同的乘客)生存率高
    #Ticket
    TicketCnt = allData.groupby(['Ticket']).size()
    allData['SameTicketNum'] = allData['Ticket'].apply(lambda x:TicketCnt[x])
    sns.barplot(x='SameTicketNum', y='Survived', data=allData)
    plt.show()
    # allData['SameTicketNum']
    

    二维/多维分析

    • 可以将任意两个/多个数据进行分析

    二维分析之Pclass & Age

    # Pclass & Age
    sns.violinplot("Pclass", "Age", hue="Survived", data=train, split=True)
    plt.show()
    

    二维分析之Age & Sex

    # Age & Sex
    sns.swarmplot(x='Age', y="Sex", data=train, hue='Survived')
    plt.show()
    

    四、数据清洗 & 异常处理

    离散型数据

    有可用标签 --> One-Hot编码

    • Sex & Pclass & Embarked 都有已经设置好的标签(int或float或string等),可以直接进行get_dummies,拆分成多维向量,增加特征维度
    • 其中,Embarked存在一定缺失值,通过对整体的分析,填充上估计值
    # Sex
    allData = allData.join(pd.get_dummies(allData['Sex'], prefix="Sex"))
    # Pclass
    allData = allData.join(pd.get_dummies(allData['Pclass'], prefix="Pclass"))
    # Embarked
    allData[allData['Embarked'].isnull()] # 查看缺失值
    allData.groupby(by=['Pclass','Embarked']).Fare.mean() # Pclass=1, Embark=C, 中位数=76
    allData['Embarked'] = allData['Embarked'].fillna('C')
    allData = allData.join(pd.get_dummies(allData['Embarked'], prefix="Embarked"))
    

    无可用标签 --> 设计标签 --> One-Hot

    • FamilySize & Name & Ticket需要对整体数据统一处理,再进行标记
    # FamilySize
    def FamilyLabel(s):
        if (s == 4):
            return 4
        elif (s == 2 or s == 3):
            return 3
        elif (s == 1 or s == 7):
            return 2
        elif (s == 5 or s == 6):
            return 1
        elif (s < 1 or s > 7):
            return 0
    allData['FamilyLabel'] = allData['FamilySize'].apply(FamilyLabel)
    allData = allData.join(pd.get_dummies(allData['FamilyLabel'], prefix="Fam"))
    
    # Name
    TitleLabelMap = {'Mr':1.0,
                     'Mrs':5.0,
                     'Miss':4.5,
                     'Master':2.5,
                     'Royalty':3.5,
                     'Officer':2.0}
    def TitleLabel(s):
        return TitleLabelMap[s]
    # allData['TitleLabel'] = allData['Title'].apply(TitleLabel)
    allData = allData.join(pd.get_dummies(allData['Title'], prefix="Title"))
    
    # Ticket
    def TicketLabel(s):
        if (s == 3 or s == 4):
            return 3
        elif (s == 2 or s == 8):
            return 2
        elif (s == 1 or s == 5 or s == 6 or s ==7):
            return 1
        elif (s < 1 or s > 8):
            return 0
    allData['TicketLabel'] = allData['SameTicketNum'].apply(TicketLabel)
    allData = allData.join(pd.get_dummies(allData['TicketLabel'], prefix="TicNum"))
    

    连续型数据

    Age & Fare

    • 进行标准化,缩小数据范围,加速梯度下降
    # Age
    allData['Child'] = allData['Age'].apply(lambda x:1 if x <= 10 else 0) # 儿童标签
    allData['Age'] = (allData['Age']-allData['Age'].mean())/allData['Age'].std() # 标准化
    allData['Age'].fillna(value=0, inplace=True) # 填充缺失值
    # Fare
    allData['Fare'] = allData['Fare'].fillna(25) # 填充缺失值
    allData[allData['Survived'].notnull()]['Fare'] = allData[allData['Survived'].notnull()]['Fare'].apply(lambda x:300.0 if x>500 else x)
    allData['Fare'] = allData['Fare'].apply(lambda x:(x-allData['Fare'].mean())/allData['Fare'].std())
    

    清除无用特征

    • 清除无用特征,降低算法复杂度
    # 清除无用特征
    allData.drop(['Cabin', 'PassengerId', 'Ticket', 'Name', 'Title', 'Sex', 'SibSp', 'Parch', 'FamilySize', 'Embarked', 'Pclass', 'Title', 'FamilyLabel', 'SameTicketNum', 'TicketLabel'], axis=1, inplace=True)
    

    重新分割训练集/测试集

    • 一开始,为了处理方便,作者将训练集和测试集合并,现在根据Survived是否缺失来讲训练集和测试集分开
    # 重新分割数据集
    train_data = allData[allData['Survived'].notnull()]
    test_data  = allData[allData['Survived'].isnull()]
    test_data = test_data.reset_index(drop=True)
    
    xTrain = train_data.drop(['Survived'], axis=1)
    yTrain = train_data['Survived']
    xTest  = test_data.drop( ['Survived'], axis=1)
    

    特征相关性分析

    • 该步骤用于筛选特征后向程序员反馈,特征是否有效、是否重叠
    • 若有问题,可以修改之前的特征方案
    # 特征间相关性分析
    Correlation = pd.DataFrame(allData[allData.columns.to_list()])
    colormap = plt.cm.viridis
    plt.figure(figsize=(24,22))
    sns.heatmap(Correlation.astype(float).corr(), linewidths=0.1, vmax=1.0, cmap=colormap, linecolor='white', annot=True, square=True)
    plt.show()
    

    五、模型建立 & 参数优化

    导入模型包

    from sklearn.pipeline import Pipeline
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import GridSearchCV
    from sklearn.feature_selection import SelectKBest
    
    • 作者选择随机森林分类器

    网格搜索调试参数

    pipe = Pipeline([('select', SelectKBest(k=10)),
                     ('classify', RandomForestClassifier(random_state = 10, max_features = 'sqrt'))])
    param_test = {'classify__n_estimators':list(range(20,100,5)),
                  'classify__max_depth'   :list(range(3,10,1))}
    gsearch = GridSearchCV(estimator=pipe, param_grid=param_test, scoring='roc_auc', cv=10)
    gsearch.fit(xTrain, yTrain)
    print (gsearch.best_params_, gsearch.best_score_)
    
    • 运行时间较长,结束后出现结果:
    {'classify__max_depth': 6, 'classify__n_estimators': 70} 0.8790924679681529
    

    建立模型

    • 用以上参数进行输入模型
    • 训练
    rfc = RandomForestClassifier(n_estimators=70, max_depth=6, random_state=10, max_features='sqrt')
    rfc.fit(xTrain, yTrain)
    

    导出结果

    predictions = rfc.predict(xTest)
    output = pd.DataFrame({'PassengerId':test['PassengerId'], 'Survived':predictions.astype('int64')})
    output.to_csv('my_submission.csv', index=False)
    

    六、提交评分

    附:完整代码

    • Jupiter Notebook导出为Python Script格式,需要ipynb格式请点击
    • GitHub源代码

    # To add a new cell, type '# %%'
    # To add a new markdown cell, type '# %% [markdown]'
    
    # %%
    import pandas as pd
    from pandas import Series, DataFrame
    import numpy as np
    from matplotlib import pyplot as plt
    import seaborn as sns
    
    # %% [markdown]
    # # Features
    # Variable | Definition | Key
    # :-:|:-:|:-:
    # survival | Survival | 0 = No, 1 = Yes
    # pclass | Ticket class(客舱等级) | 1 = 1st, 2 = 2nd, 3 = 3rd
    # sex | Sex
    # Age | Age in years
    # sibsp | # of siblings / spouses aboard the Titanic(旁系亲属)
    # parch | # of parents / children aboard the Titanic(直系亲属)
    # ticket | Ticket number
    # fare | Passenger fare
    # cabin | Cabin number(客舱编号)
    # embarked | Port of Embarkation(上船的港口编号) | C = Cherbourg, Q = Queenstown, S = Southampton
    
    # %%
    train = pd.read_csv("./kaggle/input/titanic/train.csv")
    test = pd.read_csv("./kaggle/input/titanic/test.csv")
    allData = pd.concat([train, test], ignore_index=True)
    # dataNum = train.shape[0]
    # featureNum = train.shape[1]
    train.head()
    
    
    # %%
    # Sex
    sns.countplot("Sex", hue="Survived", data=train)
    plt.show()
    
    
    # %%
    # Pclass
    sns.barplot(x="Pclass", y="Survived", data=train)
    plt.show()
    # Pclass & Age
    sns.violinplot("Pclass", "Age", hue="Survived", data=train, split=True)
    plt.show()
    
    
    # %%
    # FamilySize = SibSp + Parch + 1
    allData["FamilySize"] = allData["SibSp"] + allData["Parch"] + 1
    sns.barplot(x="FamilySize", y="Survived", data=allData)
    plt.show()
    
    
    # %%
    # Embarked
    sns.countplot("Embarked", hue="Survived", data=train)
    plt.show()
    
    
    # %%
    # Age
    sns.stripplot(x="Survived", y="Age", data=train, jitter=True)
    plt.show()
    facet = sns.FacetGrid(train, hue="Survived", aspect=2)
    facet.map(sns.kdeplot, "Age", shade=True)
    facet.set(xlim=(0, train["Age"].max()))
    facet.add_legend()
    plt.xlabel("Age")
    plt.ylabel("density")
    plt.show()
    # Age & Sex
    sns.swarmplot(x="Age", y="Sex", data=train, hue="Survived")
    plt.show()
    
    
    # %%
    # Fare
    sns.stripplot(x="Survived", y="Fare", data=train, jitter=True)
    plt.show()
    
    
    # %%
    # Name
    # allData['Title'] = allData['Name'].str.extract('([A-Za-z]+)\.', expand=False) # str.extract不知道在干嘛
    allData["Title"] = allData["Name"].apply(
        lambda x: x.split(",")[1].split(".")[0].strip()
    )
    # pd.crosstab(allData['Title'], allData['Sex'])
    TitleClassification = {
        "Officer": ["Capt", "Col", "Major", "Dr", "Rev"],
        "Royalty": ["Don", "Sir", "the Countess", "Dona", "Lady"],
        "Mrs": ["Mme", "Ms", "Mrs"],
        "Miss": ["Mlle", "Miss"],
        "Mr": ["Mr"],
        "Master": ["Master", "Jonkheer"],
    }
    TitleMap = {}
    for title in TitleClassification.keys():
        TitleMap.update(dict.fromkeys(TitleClassification[title], title))
        """
        # cnt = 0
        for name in TitleClassification[title]:
            cnt += allData.groupby(['Title']).size()[name]
        # print (title,':',cnt)
        """
    allData["Title"] = allData["Title"].map(TitleMap)
    sns.barplot(x="Title", y="Survived", data=allData)
    plt.show()
    
    
    # %%
    # Ticket
    TicketCnt = allData.groupby(["Ticket"]).size()
    allData["SameTicketNum"] = allData["Ticket"].apply(lambda x: TicketCnt[x])
    sns.barplot(x="SameTicketNum", y="Survived", data=allData)
    plt.show()
    # allData['SameTicketNum']
    
    # %% [markdown]
    # # 数据清洗
    # - Sex & Pclass & Embarked --> Ont-Hot
    # - Age & Fare --> Standardize
    # - FamilySize & Name & Ticket --> ints --> One-Hot
    
    # %%
    # Sex
    allData = allData.join(pd.get_dummies(allData["Sex"], prefix="Sex"))
    # Pclass
    allData = allData.join(pd.get_dummies(allData["Pclass"], prefix="Pclass"))
    # Embarked
    allData[allData["Embarked"].isnull()]  # 查看缺失值
    allData.groupby(by=["Pclass", "Embarked"]).Fare.mean()  # Pclass=1, Embark=C, 中位数=76
    allData["Embarked"] = allData["Embarked"].fillna("C")
    allData = allData.join(pd.get_dummies(allData["Embarked"], prefix="Embarked"))
    
    
    # %%
    # Age
    allData["Child"] = allData["Age"].apply(lambda x: 1 if x <= 10 else 0)  # 儿童标签
    allData["Age"] = (allData["Age"] - allData["Age"].mean()) / allData["Age"].std()  # 标准化
    allData["Age"].fillna(value=0, inplace=True)  # 填充缺失值
    # Fare
    allData["Fare"] = allData["Fare"].fillna(25)  # 填充缺失值
    allData[allData["Survived"].notnull()]["Fare"] = allData[allData["Survived"].notnull()][
        "Fare"
    ].apply(lambda x: 300.0 if x > 500 else x)
    allData["Fare"] = allData["Fare"].apply(
        lambda x: (x - allData["Fare"].mean()) / allData["Fare"].std()
    )
    
    
    # %%
    # FamilySize
    def FamilyLabel(s):
        if s == 4:
            return 4
        elif s == 2 or s == 3:
            return 3
        elif s == 1 or s == 7:
            return 2
        elif s == 5 or s == 6:
            return 1
        elif s < 1 or s > 7:
            return 0
    
    
    allData["FamilyLabel"] = allData["FamilySize"].apply(FamilyLabel)
    allData = allData.join(pd.get_dummies(allData["FamilyLabel"], prefix="Fam"))
    
    # Name
    TitleLabelMap = {
        "Mr": 1.0,
        "Mrs": 5.0,
        "Miss": 4.5,
        "Master": 2.5,
        "Royalty": 3.5,
        "Officer": 2.0,
    }
    
    
    def TitleLabel(s):
        return TitleLabelMap[s]
    
    
    # allData['TitleLabel'] = allData['Title'].apply(TitleLabel)
    allData = allData.join(pd.get_dummies(allData["Title"], prefix="Title"))
    
    # Ticket
    def TicketLabel(s):
        if s == 3 or s == 4:
            return 3
        elif s == 2 or s == 8:
            return 2
        elif s == 1 or s == 5 or s == 6 or s == 7:
            return 1
        elif s < 1 or s > 8:
            return 0
    
    
    allData["TicketLabel"] = allData["SameTicketNum"].apply(TicketLabel)
    allData = allData.join(pd.get_dummies(allData["TicketLabel"], prefix="TicNum"))
    
    
    # %%
    # 清除无用特征
    allData.drop(
        [
            "Cabin",
            "PassengerId",
            "Ticket",
            "Name",
            "Title",
            "Sex",
            "SibSp",
            "Parch",
            "FamilySize",
            "Embarked",
            "Pclass",
            "Title",
            "FamilyLabel",
            "SameTicketNum",
            "TicketLabel",
        ],
        axis=1,
        inplace=True,
    )
    
    # 重新分割数据集
    train_data = allData[allData["Survived"].notnull()]
    test_data = allData[allData["Survived"].isnull()]
    test_data = test_data.reset_index(drop=True)
    
    xTrain = train_data.drop(["Survived"], axis=1)
    yTrain = train_data["Survived"]
    xTest = test_data.drop(["Survived"], axis=1)
    
    # allData.columns.to_list()
    
    
    # %%
    # 特征间相关性分析
    Correlation = pd.DataFrame(allData[allData.columns.to_list()])
    colormap = plt.cm.viridis
    plt.figure(figsize=(24, 22))
    sns.heatmap(
        Correlation.astype(float).corr(),
        linewidths=0.1,
        vmax=1.0,
        cmap=colormap,
        linecolor="white",
        annot=True,
        square=True,
    )
    plt.show()
    
    # %% [markdown]
    # # 网格筛选随机森林参数
    # - n_estimator
    # - max_depth
    
    # %%
    from sklearn.pipeline import Pipeline
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import GridSearchCV
    from sklearn.feature_selection import SelectKBest
    
    
    # %%
    
    pipe = Pipeline(
        [
            ("select", SelectKBest(k=10)),
            ("classify", RandomForestClassifier(random_state=10, max_features="sqrt")),
        ]
    )
    param_test = {
        "classify__n_estimators": list(range(20, 100, 5)),
        "classify__max_depth": list(range(3, 10, 1)),
    }
    gsearch = GridSearchCV(estimator=pipe, param_grid=param_test, scoring="roc_auc", cv=10)
    gsearch.fit(xTrain, yTrain)
    print(gsearch.best_params_, gsearch.best_score_)
    
    
    # %%
    rfc = RandomForestClassifier(
        n_estimators=70, max_depth=6, random_state=10, max_features="sqrt"
    )
    rfc.fit(xTrain, yTrain)
    predictions = rfc.predict(xTest)
    
    output = pd.DataFrame(
        {"PassengerId": test["PassengerId"], "Survived": predictions.astype("int64")}
    )
    output.to_csv("my_submission.csv", index=False)
    

    链接:GitHub源代码

    展开全文
  • 本课程以SPSS Modeler为应用软件,以数据挖掘项目生命周期为线索,以实际数据挖掘项目为例,讲解了从项目商业理解开始,到后应用Modeler软件实现的挖掘过程。...
    SPSS Modeler数据挖掘项目实战(数据挖掘、建模技术)—1018人已学习 
    课程介绍    
    201801311312396344.jpg
        本课程以SPSS Modeler为应用软件,以数据挖掘项目生命周期为线索,以实际数据挖掘项目为例,讲解了从项目商业理解开始,到后应用Modeler软件实现的挖掘过程。
    课程收益
        熟悉数据挖掘项目的生命周期,培养数据挖掘项目的管理思想,融入每一次项目实际。培养对数据挖掘项目的统筹、接口、把控能力。
    讲师介绍
        张璇更多讲师课程
        北风网数据分析讲师多年数据分析、数据挖掘经验。参与过大型互联网、网游、金融等行业的数据挖掘工作,熟悉电子商务数据分析与挖掘、数据可视化、文本挖掘。
    课程大纲
      第1章:数据挖掘项目管理基础与思想
        1.课程规划1  18:31
        2.课程规划2  10:23
        3.课程规划3  10:23
        4.DM项目生命周期与建设过程1  18:58
        5.DM项目生命周期与建设过程2  18:41
        6.DM项目生命周期与建设过程3  19:15
        7.CRISP-DM详解1  19:49
        8.CRISP-DM详解2  19:24
        9.CRISP-DM详解3  19:09
        10.CRISP-DM详解4  18:44
        11.DM项目实际建设与管理过程(上)1  24:47
        12.DM项目实际建设与管理过程(上)2  21:51
        13.DM项目实际建设与管理过程(上)3  25:37
        14.DM项目实际建设与管理过程(下)1  20:01
        15.DM项目实际建设与管理过程(下)2  21:34
        16.DM项目实际建设与管理过程(下)3  19:11
        17.DM项目实际建设与管理过程(下)4  20:07
        18.DM项目实际建设与管理过程(下)5  22:38
        19.DM项目实际建设与管理过程(下)6  19:44
        20.DM项目团队组成与能力素养1  20:56
        21.DM项目团队组成与能力素养2  21:22
      第2章:感性认识SPSS Modeler
        1.SPSS MODELER软件介绍1  19:26
        2.SPSS MODELER软件介绍2  22:38
        3.SPSS MODELER软件介绍3  21:07
        4.SPSS MODELER节点1  20:07
        5.SPSS MODELER节点2  20:59
        6.SPSS MODELER节点3  21:17
        7.SPSS MODELER节点4  20:37
        8.SPSS MODELER节点5  22:09
        9.MODELER数据流解读1  19:34
        10.MODELER数据流解读2  20:43
        11.MODELER数据流解读3  19:48
        12.MODELER数据流解读4  18:21
        13.MODELER数据流解读5  17:55
      第3章:必备的统计学基础
        1.简单的统计学概念1  19:47
        2.简单的统计学概念2  20:22
        3.简单的统计学概念3  19:05
        4.简单的统计学概念4  21:54
        5.简单的统计学概念5  10:17
        6.常用的统计分布1  20:40
        7.常用的统计分布2  20:12
        8.常用的统计分布3  19:11
        9.常用的统计分布4  23:28
        10.统计学其它补充1  23:54
        11.统计学其它补充2  20:42
        12.统计学其它补充3  20:09
      第4章:数据准备与预处理
        1.数据质量与样本管理1  20:05
        2.数据质量与样本管理2  19:49
        3.数据质量与样本管理3  20:13
        4.数据质量与样本管理4  20:34
        5.数据质量与样本管理5  18:54
        6.数据质量与样本管理6  20:14
        7.数据质量与样本管理7  18:12
        8.数据变量管理1  20:17
        9.数据变量管理2  20:24
        10.数据变量管理3  20:11
        11.数据变量管理4  19:45
        12.数据变量管理5  20:49
        13.MODELER分析管理1  18:51
        14.MODELER分析管理2  21:30
        15.MODELER分析管理3  20:30
        16.MODELER分析管理4  20:26
        17.MODELER分析管理5  19:36
        18.MODELER分析管理6  20:16
      第5章:常用模型的数学思想与思考
        1.数据挖掘知识类型1  17:27
        2.数据挖掘知识类型2  18:14
        3.建模过程管理1  16:44
        4.建模过程管理2  15:40
        5.(上)回归分析思想与建模解释1  19:15
        6.(上)回归分析思想与建模解释2  20:28
        7.(上)回归分析思想与建模解释3  19:52
        8.(上)回归分析思想与建模解释4  23:45
        9.(上)回归分析思想与建模解释5  18:32
        10.(上)回归分析思想与建模解释6  18:31
        11.(下)回归分析建模解释(续)1  17:28
        12.(下)回归分析建模解释(续)2  20:46
        13.(下)回归分析建模解释(续)3  18:26
        14.(下)回归分析建模解释(续)4  19:29
        15.(下)回归分析建模解释(续)5  20:38
        16.决策树思想与建模解释1  22:19
        17.决策树思想与建模解释2  19:55
        18.决策树思想与建模解释3  17:34
        19.决策树思想与建模解释4  21:10
        20.决策树思想与建模解释5  21:30
        21.回归与决策树增补  28:40
        22.神经网络思想与建模解释1  20:03
        23.神经网络思想与建模解释2  22:04
        24.神经网络思想与建模解释3  18:53
        25.神经网络思想与建模解释4  20:20
        26.神经网络思想与建模解释5  6:50
        27.SVM思想原理与补充解释  30:27
        28.聚类思想与建模解释1  18:18
        29.聚类思想与建模解释2  16:25
        30.聚类思想与建模解释3  18:57
        31.聚类思想与建模解释4  19:31
        32.聚类思想与建模解释5  22:24
        33.聚类思想与建模解释6  20:16
        34.关联分析思想与节点解释1  21:34
        35.关联分析思想与节点解释2  20:20
        36.关联分析思想与节点解释3  18:58
        37.关联分析思想与节点解释4  20:01
        38.关联分析思想与节点解释5  21:30
        39.关联分析思想与节点解释6  23:13
      第6章:项目案例解析
        1.信用风险评估1  20:08
        2.信用风险评估2  20:45
        3.信用风险评估3  20:35
        4.信用风险评估4  18:59
        5.信用风险评估5  21:01
        6.辅助决策支持1  20:22
        7.辅助决策支持2  19:41
        8.辅助决策支持3  19:12
        9.辅助决策支持4  11:00
    大家可以点击【查看详情】查看我的课程
    展开全文
  • 稍微进阶一些的,可以借助其他辅助特征:例如测试数据中Fare缺失的数据,每个乘客的Ticket是唯一的,无法通过查找相同的票号加个来填补,但是,船票价格往往跟  Pclass (客舱等级)及 Cabin (客舱号)有关的,...

    参考资料:https://www.bilibili.com/video/av27536643

    https://blog.csdn.net/aaronjny/article/details/79735998

    https://github.com/AaronJny/simple_titanic

    https://zhuanlan.zhihu.com/p/30538352

    https://www.jianshu.com/p/9a5bce0de13f


    1. 查看数据集

    import pandas as pd
    
    # 读取数据集
    train_data = pd.read_csv('Data/train.csv')
    test_data = pd.read_csv('Data/test.csv')
    # 打印信息
    train_data.info()

       以上特征含义为:

    1. PassengerId 乘客编号
    2. Survived 是否幸存
    3. Pclass 船票等级
    4. Name 乘客姓名
    5. Sex 乘客性别
    6. SibSp、Parch 亲戚数量
    7. Ticket 船票号码
    8. Fare 船票价格
    9. Cabin 船舱
    10. Embarked 登录港口

    2. 特征选择

    根据经验,认为乘客编号、乘客姓名、船票号码、船舱跟逃生几率无关,所以初步选择 ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked'] 作为训练特征。从打印出来的数据可以发现,序号是891个,但是并不是所有的特征都满足891,所以某些特征存在缺失值。

    # 选择用于训练的特征
    features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
    x_train = train_data[features]
    x_test = test_data[features]
    
    y_train=train_data['Survived']
    
    # 检查缺失值
    x_train.info()
    print('-'*100)
    x_test.info()

     


    3. 特征缺失值处理

    所以我们发现,训练数据中的Age,Embarked,测试数据 Age,Fare,Embarked。送入模型中的标签和特征要可以一一对应,所以要么丢掉特征不完整的样本,要么填充。秉着尽可能使用样本的态度,我们选择填充特征。

    如何补全数据集呢?最简单的方法:对于数值型数据,可以使用其平均值/中位数填补空值,尽量减小填补值对结果的影响。对于类别数据,可以使用众数来填补。稍微进阶一些的,可以借助其他辅助特征:例如测试数据中Fare缺失的数据,每个乘客的Ticket是唯一的,无法通过查找相同的票号加个来填补,但是,船票价格往往跟 Pclass (客舱等级)及 Cabin(客舱号)有关的,因此使用具有相同PclassCabin的中位数或着众数来填补。 

    这里先采用最简单的方法进行填补。

    # 使用平均年龄来填充年龄中的nan值
    x_train['Age'].fillna(x_train['Age'].mean(), inplace=True)
    x_test['Age'].fillna(x_test['Age'].mean(),inplace=True)
    
    # 使用票价的均值填充票价中的nan值
    x_test['Fare'].fillna(x_test['Fare'].mean(),inplace=True)
    
    # 使用登录最多的港口来填充登录港口的nan值
    print x_train['Embarked'].value_counts()
    x_train['Embarked'].fillna('S', inplace=True)
    x_test['Embarked'].fillna('S',inplace=True)

    4. 特征值转换为特征向量

    机器学习中,送入模型的是矩阵,而上述特征中并不是所有的特征都是数值型的,需要把一些非数值型的特征转为数值。例如性别,我们可以简单的想到“0”,“1”来代表,那么“Embarked”的"C","Q","S" 要选择用“0”,“1”,“2”来代替吗?若两个特征之间的距离是,d(C, Q) = 1, d(Q, S) = 1, d(C, S) = 2。那么C和S工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到C = (1, 0, 0), Q= (0, 1, 0), S = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个特征之间的距离是一样的,显得更合理。因此,我们使用 one-hot编码。

    # 将特征值转换成特征向量
    dvec=DictVectorizer(sparse=False)
    
    x_train=dvec.fit_transform(x_train.to_dict(orient='record'))
    x_test=dvec.transform(x_test.to_dict(orient='record'))
    
    # 打印特征向量格式
    print (dvec.feature_names_)

    因此,将特征值转换为特征向量后的格式:

    例如打印一条数据,具体内容:

    print (x_train[100])

    特征向量的值与上面的名称一一对应。

     

    展开全文
  • 第一层的数据:为了训练得到三个模型第二层的数据:为了用三个模型来预测输出,得到的输入送入线性分类器得到最终的预估y^y^,再不断的训练模型使得模型的预估和真实的y′y′最接近,之所以将数据分成两组,是为了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,967
精华内容 9,186
关键字:

数据挖掘项目实战