一、实验目的
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)读入文件,删除不需要的属性,去掉带缺失属性的样本
- # 读入文件
- data = pd.read_csv('train.csv')
- # 删除不需要的属性 删除有空白值的样本
- data = data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis = 1)
- data = data.dropna()
2)混合属性相异性度量规则,根据公式可知,由于我们已将含有空白值属性的样本删除,我们要计算出每两个对象之间除了非对称二元属性(若两对像取值皆为0)之外的属性总数。再根据不同属性所属的类型(标称,对称二元,数值,序数)来按照对应的规则计算其向异性,再根据公式相加即可得混合类型属性集的相异性度量。
图 1混合属性相异性度量规则
3)将数值属性进行预处理,以便后续计算其相异性
- def num_Atr(Atr):
- data[Atr] = data[Atr] / (data[Atr].max() - data[Atr].min())
- return data[Atr]
4)计算标称属性或二元属性的相异性
- def Nom_Atr(i, j, Atr):
- if data.iloc[i][Atr] == data.iloc[j][Atr]:
- return 0
- return 1
5)判断非对称二元属性是否两样本取值都为0,若为0则属性总数-1
- def U_Bin_Atr(i, j, Atr):
- if data.iloc[i][Atr] == 0 & data.iloc[j][Atr] ==0:
- return int(-1)
- return int(0)
6)#PClass虽然是序数属性 但已经呈数值形式 可以用标称属性计算方法来计算其向异性
7)计算混合属性相异性度量
- def Mix_Atr(i, j):
- # 标准化数值属性
- data['Age'] = num_Atr('Age')
- data['SibSp'] = num_Atr('SibSp')
- data['Parch'] = num_Atr('Parch')
- data['Fare'] = num_Atr('Fare')
- sum_true_Atr = sum_Atrri
- sum_true_Atr += U_Bin_Atr(i,j,'Survived')
- 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'])
- sum_Nom = Nom_Atr(i, j, 'Pclass') + Nom_Atr(i, j, 'Sex') + Nom_Atr(i, j, 'Embarked')
- res = (sum_Nom+sum_num)/sum_true_Atr
- return res
4.2.2 K近邻算法幸存者分析实验
1)读入文件,删除不需要的属性,去掉带缺失属性的样本
- # 读入文件
- data = pd.read_csv('train.csv')
- # 删除不需要的属性 删除有空白值的样本
- data = data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis = 1)
- data = data.dropna()
2)将非数值属性进行one-hot编码
- data = pd.get_dummies(data, columns=['Sex', 'Embarked'])
3)数据划分
- # 数据划分 属性&标签
- X = data.drop('Survived', axis = 1)
- y = data['Survived']
- # 划分训练集,测试集 前70%用作训练和验证,后30%用作测试。
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)
4)属性数据归一化(标准化)
- scaler = StandardScaler()
- X_train = scaler.fit_transform(X_train)
- X_test = scaler.transform(X_test)
5)交叉验证法选出最好的k值
- best_k = 0
- best_accuracy = 0
- for k in range(1,11):
- knn = KNeighborsClassifier(n_neighbors=k)
- score = cross_val_score(knn, X_train, y_train, cv = 5) ##五折交叉验证
- mean_score = score.mean()
- if mean_score>best_accuracy:
- best_k = k
- best_accuracy = best_accuracy
6)K近邻算法训练并评估
- knn = KNeighborsClassifier(n_neighbors=best_k)
- knn.fit(X_train, y_train)
- y_pred = knn.predict(X_test)
- Accuracy = accuracy_score(y_test, y_pred)
- print("best_k: ", best_k)
- print("Accuracy: ", Accuracy)
4.2.3 两者结合 用自定义距离测量函数作为KNN参数测量距离
1)更改metric参数
- knn = KNeighborsClassifier(n_neighbors=best_k, metric=Mix_Atr)
2)发现knn里pandas会默认变成ndarray,且传进Mix_Atr的需要是两个ndarray,导致属性名消失,每次抽取两行数据,只能对i行和j行数据用数字进行索引。
图 2KNN函数中metric参数说明
3)于是对距离计算函数做出如下修改调整
x , y参数代表两个数组
- def Mix_Atr(x, y):
- # 标准化数值属性
- sum_true_Atr = sum_Atrri
- # sum_true_Atr += U_Bin_Atr(i,j,'Survived')
- sum_num = abs(x[1] - y[1]) + abs(x[2] - y[2]) + abs(x[3] - y[3]) + abs(x[4] - y[4])
- 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)
- res = (sum_Nom+sum_num)/sum_true_Atr
- return res
五、实验结论
5.1计算混合属性相异性度量的结果
- res = Mix_Atr(1,2)
- print(res)
图 3 对象1和对象2的相异性
5.2 K近邻算法对泰坦尼克号数据集幸存者分析实验结果
图 4最佳K值以及精确度
5.3使用混合属性距离作为KNN参数的实验分析结果
图 5最佳K值以及精确度