赞
踩
本节将根据14个属性建立分类器评估一个人的收入等级。可能的输出类型是“高于50K”和“低 于或等于50K”。这个数据集稍微有点复杂,里面的每个数据点都是数字和字符串的混合体。数值 数据是有价值的,在这种情况下,不能用标记编码器进行编码。需要设计一套既可以处理数值数 据,也可以处理非数值数据的系统。我们将用美国人口普查收入数据集中的数据: https://archive.ics.uci.edu/ml/datasets/Census+Income 。
# 导入相关的包 import numpy as np from sklearn import preprocessing from sklearn.naive_bayes import GaussianNB from sklearn import model_selection # 加载数据集 input_file = "adult.data.txt" X = [] y = [] count_lessthan50k = 0 # 统计收入<=50k的人数 count_morethan50k = 0 # 统计收入>50k的人数 num_images_threshold = 10000 ''' 我们将使用数据集中的20 000个数据点——每种类型10 000个,保证初始类型没有偏差。 在模型训练时,如果你的大部分数据点都属于一个类型,那么分类器就会倾向于这个类型。因此, 最好使用每个类型数据点数量相等的数据进行训练: ''' with open(input_file, 'r') as f: for line in f.readlines(): if '?' in line: continue data = line[:-1].split(', ') # 将每一行数据放到一个列表当中 if data[-1] == '<=50K' and count_lessthan50k < num_images_threshold: X.append(data) count_lessthan50k += 1 elif data[-1] == '>50K' and count_morethan50k < num_images_threshold: X.append(data) count_morethan50k += 1 if count_lessthan50k >=num_images_threshold and count_morethan50k >= num_images_threshold: break X = np.array(X) # 标记编码 label_encoder = [] X_encoded = np.empty(X.shape) for i,item in enumerate(X[0]): if item.isdigit(): X_encoded[:, i] = X[:, i] # 如果这个属性本身就是数值,那么直接不需要标记编码,原封不动即可!! else: label_encoder.append(preprocessing.LabelEncoder()) X_encoded[:, i] = label_encoder[-1].fit_transform(X[:, i]) X = X_encoded[:, :-1].astype(int) y = X_encoded[:, -1].astype(int) # 创建分类器 classifier_gaussiannb = GaussianNB() classifier_gaussiannb.fit(X, y) # 把数据分割成训练数据集和测试数据集,方便后面获取性能指标: X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.25, random_state=5) classifier_gaussiannb = GaussianNB() classifier_gaussiannb.fit(X_train, y_train) y_test_pred = classifier_gaussiannb.predict(X_test) # 交叉验证 # 计算分类器的F1得分 f1 = model_selection.cross_val_score(classifier_gaussiannb, X, y, scoring='f1_weighted', cv=5) print("F1 score: " + str(round(100*f1.mean(), 2)) + "%") # 使用单一的数据示例进行测试 input_data = ['39', 'State-gov', '77516', 'Bachelors', '13', 'Never-married', 'Adm-clerical', 'Not-in-family', 'White', 'Male', '2174', '0', '40', 'United-States'] count = 0 input_data_encoded = [-1] * len(input_data) for i,item in enumerate(input_data): if item.isdigit(): input_data_encoded[i] = int(input_data[i]) else: input_data_encoded[i] = int(label_encoder[count].transform([input_data[i]])) count = count + 1 input_data_encoded = np.array(input_data_encoded) input_data_encoded = input_data_encoded.reshape(1, len(input_data)) # 打印单一的数据示例的预测结果 output_class = classifier_gaussiannb.predict(input_data_encoded) print(label_encoder[-1].inverse_transform(output_class)[0]) # 使用inverse_transform函数进行标记解码
链接:https://pan.baidu.com/s/19ModMp40DEny30F5h_Z-Pg
提取码:evyn
复制这段内容后打开百度网盘手机App,操作更方便哦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。