泰坦尼克号数据集乘客幸存分析实验

一、实验目的

1. 掌握数据挖掘中混合属性的邻近性度量的计算方式。

二、实验内容

1. 泰坦尼克号数据集乘客幸存分析实验

(1)分析泰坦尼克号数据集,说明每个属性的类别;

(2)将幸存属性设置为类别标签,使用K近邻算法作为分类算法(无需考虑PassengerID,name,ticket和cabin,去掉带缺失属性的样本),在测试集上预测乘客的幸存情况并计算准确率。

注1:数据对象之间的邻近性度量采用混合类型属性的计算方式。

注2:从训练集中以合适的比例划分出验证集,利用交叉验证选择合适的K值。

三、实验报告评分标准

1. 完成实验(1)(10分)

2. 完成实验(2)(60分)

4. 实验过程与实验结论的记录完整(10分)

5. 表述逻辑清晰(10分)

6. 排版工整自洽,图表标题准确(10分)

四、实验过程

4.1 问题一

Passenger:乘客编号。                             标称属性

Pclass:表示乘客所在船舱等级                                     序数属性

Name:乘客的姓名。                                                   标称属性

Sex:乘客的性别。                                                       二元属性

Age:乘客的年龄。                                                      比率标度属性

SibSp:乘客在船上的兄弟姐妹或配偶数量。                比率标度属性  

Parch:乘客在船上的父母或子女的数量。                    比率标度属性

Ticket:乘客的船票号码。                           标称属性

Fare:乘客的票价或费用。                                           比率标度属性

Cabin:乘客的舱位号。                                                标称属性

Embarked:乘客上船地点                                            标称属性

Survived:指示乘客是否幸存                                       二元属性

4.2问题二

4.2.1计算混合类型属性集相异性

1)读入文件,删除不需要的属性,去掉带缺失属性的样本

  1. 读入文件  
  2. data = pd.read_csv('train.csv')  
  3. 删除不需要的属性 删除有空白值的样本  
  4. data = data.drop(['PassengerId''Name''Ticket''Cabin'], axis = 1)  
  5. data = data.dropna()  

2)混合属性相异性度量规则,根据公式可知,由于我们已将含有空白值属性的样本删除,我们要计算出每两个对象之间除了非对称二元属性(若两对像取值皆为0)之外的属性总数。再根据不同属性所属的类型(标称,对称二元,数值,序数)来按照对应的规则计算其向异性,再根据公式相加即可得混合类型属性集的相异性度量。

图 1混合属性相异性度量规则

3)将数值属性进行预处理,以便后续计算其相异性

  1. def num_Atr(Atr):  
  2.     data[Atr] = data[Atr] / (data[Atr].max() - data[Atr].min())  
  3.     return data[Atr]  

4)计算标称属性或二元属性的相异性

  1. def Nom_Atr(i, j, Atr):  
  2.     if data.iloc[i][Atr] == data.iloc[j][Atr]:  
  3.         return 0  
  4.     return 1 

5)判断非对称二元属性是否两样本取值都为0,若为0则属性总数-1

  1. def U_Bin_Atr(i, j, Atr):  
  2.     if data.iloc[i][Atr] == 0 & data.iloc[j][Atr] ==0:  
  3.         return int(-1)  
  4.     return int(0)  

6)#PClass虽然是序数属性 但已经呈数值形式 可以用标称属性计算方法来计算其向异性

7)计算混合属性相异性度量

  1. def Mix_Atr(i, j):  
  2. 标准化数值属性  
  3.     data['Age'] = num_Atr('Age')  
  4.     data['SibSp'] = num_Atr('SibSp')  
  5.     data['Parch'] = num_Atr('Parch')  
  6.     data['Fare'] = num_Atr('Fare')  
  7.     sum_true_Atr = sum_Atrri  
  8.     sum_true_Atr += U_Bin_Atr(i,j,'Survived')  
  9.     sum_num = abs(data.iloc[i]['Age'] - data.iloc[j]['Age']) + abs(data.iloc[i]['SibSp'] - data.iloc[j]['SibSp']) + abs(data.iloc[i]['Parch'] - data.iloc[j]['Parch']) + abs(data.iloc[i]['Fare'] - data.iloc[j]['Fare'])  
  10.     sum_Nom = Nom_Atr(i, j, 'Pclass') + Nom_Atr(i, j, 'Sex') + Nom_Atr(i, j, 'Embarked')  
  11.   
  12.     res = (sum_Nom+sum_num)/sum_true_Atr  
  13.   
  14.     return res  

4.2.2 K近邻算法幸存者分析实验

1)读入文件,删除不需要的属性,去掉带缺失属性的样本

  1. 读入文件  
  2. data = pd.read_csv('train.csv')  
  3. 删除不需要的属性 删除有空白值的样本  
  4. data = data.drop(['PassengerId''Name''Ticket''Cabin'], axis = 1)  
  5. data = data.dropna()  

2)将非数值属性进行one-hot编码

  1. data = pd.get_dummies(data, columns=['Sex''Embarked'])  

3)数据划分

  1. 数据划分 属性&标签  
  2. X = data.drop('Survived', axis = 1)  
  3. y = data['Survived']  
  4.   
  5. 划分训练集,测试集 70%用作训练和验证,后30%用作测试。  
  6. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)  

4)属性数据归一化(标准化)

  1. scaler = StandardScaler()  
  2. X_train = scaler.fit_transform(X_train)  
  3. X_test = scaler.transform(X_test)  

5)交叉验证法选出最好的k值

  1. best_k = 0  
  2. best_accuracy = 0  
  3. for k in range(1,11):  
  4.     knn = KNeighborsClassifier(n_neighbors=k)  
  5.     score = cross_val_score(knn, X_train, y_train, cv = 5) ##五折交叉验证  
  6.     mean_score = score.mean()  
  7.     if mean_score>best_accuracy:  
  8.         best_k = k  
  9.         best_accuracy = best_accuracy  

6)K近邻算法训练并评估

  1. knn = KNeighborsClassifier(n_neighbors=best_k)  
  2. knn.fit(X_train, y_train)  
  3. y_pred = knn.predict(X_test)  
  4. Accuracy = accuracy_score(y_test, y_pred)  
  5.   
  6. print("best_k: ", best_k)  
  7. print("Accuracy: ", Accuracy)  

4.2.3 两者结合 用自定义距离测量函数作为KNN参数测量距离

1)更改metric参数

  1. knn = KNeighborsClassifier(n_neighbors=best_k, metric=Mix_Atr)  

2)发现knn里pandas会默认变成ndarray,且传进Mix_Atr的需要是两个ndarray,导致属性名消失,每次抽取两行数据,只能对i行和j行数据用数字进行索引。

图 2KNN函数中metric参数说明

3)于是对距离计算函数做出如下修改调整

x , y参数代表两个数组

  1. def Mix_Atr(x, y):  
  2. 标准化数值属性  
  3.   
  4.     sum_true_Atr = sum_Atrri  
  5.     # sum_true_Atr += U_Bin_Atr(i,j,'Survived')  
  6.     sum_num = abs(x[1] - y[1]) + abs(x[2] - y[2]) + abs(x[3] - y[3]) + abs(x[4] - y[4])  
  7.     sum_Nom = Nom_Atr(x,y,0) + Nom_Atr(x,y,5) + Nom_Atr(x,y,6)+ Nom_Atr(x,y,7)+ Nom_Atr(x,y,8)+ Nom_Atr(x,y,9)  
  8.   
  9.     res = (sum_Nom+sum_num)/sum_true_Atr  
  10.   
  11.     return res  

五、实验结论

5.1计算混合属性相异性度量的结果

  1. res = Mix_Atr(1,2)  
  2. print(res)  

图 3 对象1和对象2的相异性

5.2 K近邻算法对泰坦尼克号数据集幸存者分析实验结果

图 4最佳K值以及精确度

5.3使用混合属性距离作为KNN参数的实验分析结果

图 5最佳K值以及精确度

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值