项目介绍
- https://www.kaggle.com/annavictoria/speed-dating-experiment
- 数据集采集自2002-2004"闪电约会"试验
- 参与者有4分钟时间与异性交流
- 4分钟后参与者回答是否愿意同该异性再次约会
- 同时双方需要为对方的6个属性进行评分:
1.吸引力(Attractiveness)
2.忠实度(Sincerity)
3.智慧(Intelligence)
4.幽默(Fun)
5.野心(Ambition)
6.共同爱好(Shared Interest)
- 该数据集也包括来自约会过程中不同时间点的问卷调查数据:
1.人口同统计学信息(demographics)
2.约会习惯(dating habits)
3.自我认知(self-perception across key attributes)
4.信仰(beliefs on what others find valuable in a mate)
5.生活方式(lifestyle information)
项目任务
- 配对预测
- 掌握交叉验证
- 掌握ROC曲线的绘制
分析步骤
1.查看数据集
2.明确分析目标
3.处理缺失数据
4.数据处理、重构
- 每一行是一个参与者的属性,应该把两个人放在一行
5.选择模型、特征
- 训练模型
- 交叉验证
6.保存分析结果
- 评价模型(ROC)
为什么要用ROC? 因为参加配对的人有500对,可能只有百分之十的人会再次见面,所以10%是正样本,90%都是负样本。是一个极度不平衡的训练数据。
下面是项目代码:
主要是3个.py文件
mian.py
# -*- coding: utf-8 -*-
'''
Created on 8 Jan,2019
@author:Zhoukaixuan
'''
import os
import pandas as pd
import numpy as np
from zip_tools import get_dataset_filename,unzip
from pandas_tools import inspect_dataset,process_missing_data,get_pair_data
from ml_tools import select_features,banlance_samples,train_model,print_test_results,plot_roc
from sklearn.model_selection import train_test_split
#声明变量
dataset_path = 'e:/data' #数据集路径
zip_filename = 'Speed Dating Data.csv.zip' #zip文件名
zip_filepath = os.path.join(dataset_path,zip_filename) # zip文件路径
dataset_filename = get_dataset_filename(zip_filepath) #数据集文件名(在zip中)
dataset_filepath = os.path.join(dataset_path,dataset_filename) #数据集文件路径
#是否处理非平衡数据
is_process_unbalanced_data = True
#是否交叉验证
is_cv = True
#是否进行特征选择
is_feat_select = True
#设置随机种子
random_seed = 7
np.random.seed(random_seed)
def run_main():
'''
主函数
'''
## 解压数据集
print ("解压zip..."),
unzip(zip_filepath, dataset_path)
print ("完成.")
##1.查看数据集
df_data = pd.read_csv(dataset_filepath,encoding='ISO-8859-1')
inspect_dataset(df_data)
## 2.处理缺失数据
df_data = process_missing_data(df_data)
## 3.数据处理构建特征,并重构数据
#获取重构“成对”数据,以便放入预测模型
pair_data,labels,features = get_pair_data(df_data)
#进行特征选择
if is_feat_select:
pair_data,selected_features = select_features(pair_data,labels,features)
print('选择的特征:')
print(selected_features)
n_pos_samples = labels[labels == 1].shape[0]
n_neg_samples = labels[labels == 0].shape[0]
print('正样本数:%d' % n_pos_samples)
print('负样本数:%d' % n_neg_samples)
#处理非平衡数据
if is_process_unbalanced_data:
pair_data,labels = banlance_samples(pair_data,labels)
#分隔训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(pair_data,labels,
test_size=0.1,
random_state=random_seed)
#4.训练模型,测试模型
print ("逻辑回归模型:")
logistic_model = train_model(X_train,y_train,