用id3算法,得出泰坦尼克号生存率预测:
测试集与训练集:
链接: https://pan.baidu.com/s/1AsWe81NfddCoWAwmHp97Iw 提取码: zp8x 复制这段内容后打开百度网盘手机App,操作更方便哦
我们看下步骤:
1、数据导入与探索
使用 info() 了解数据表的基本情况:行数、列数、每列的数据类型、数据完整度;
使用 describe() 了解数据表的统计情况:总数、平均值、标准差、最小值、最大值等;
使用 describe(include=[‘O’]) 查看字符串类型(非数字)的整体情况;
使用 head 查看前几行数据(默认是前 5 行);
使用 tail 查看后几行数据(默认是最后 5 行)。
import pandas as pd
#数据加载
train_data = pd.read_csv('./train.csv')
test_data = pd.read_csv('./test.csv')
#数据探索
print(train_data.info())#了解数据表基本情况:行数RangeIndex、列数Data columns、每列的数据类型、数据完整度;
print('_'*30)#分割线
print(train_data.describe())#了解数据表的统计情况:总数cout、平均数mean、标准差std、最小值min、最大值max等;
print('_'*30)#分割线
print(train_data.describe(include=['O']))#查看字符串类型(非数字)的整体情况O为大写的哦
print('_'*30)#分割线
print(train_data.head())#前30行的情况
print('_'*30)#分割线
print(train_data.tail())
2、数据清理与整合
#缺失值为age年龄,fare船票价格,cabin船舱,Embarked为字符串
#1、使用平均年龄来填充年龄中的nan值
train_data['Age'].fillna(train_data['Age'].mean(),inplace=True)
test_data['Age'].fillna(test_data['Age'].mean(),inplace=True)
#2使用平均票价来填充票价中的nan值
train_data['Fare'].fillna(train_data['Fare'].mean,inplace=True)
test_data['Fare'].fillna(test_data['Fare'].mean,inplace=True)
#查看Embarked的字段取值
print(train_data['Embarked'].value_counts())
#使用最多的s港口补齐缺失值
train_data['Embarked'].fillna('S',inplace=True)
test_data['Embarked'].fillna('S',inplace=True)
3、特征选择
#特征选择,除去无用信息
features=['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
train_features=train_data[features]
train_lables=train_data['Survived']
test_features=train_data[features]
4、将字符串转化成0/1字符替代
特征选择是分类模型好坏的关键。选择什么样的特征,以及对应的特征值矩阵,决定了分类模型的好坏。通常情况下,特征值不都是数值类型,可以使用 DictVectorizer 类进行转化;
#特征值里有一些字符串不方便计算,用DictVectorizer转换为字符串,如性别,可用1,2,代替male和female
from sklearn.feature_extraction import DictVectorizer
dvec=DictVectorizer(sparse=False)
train_features=dvec.fit_transform(train_features.to_dict(orient='record'))#训练集特征矩阵
5、模型建立,与测试集数据代入
#决策树模型
from sklearn.tree import DecisionTreeClassifier
#构造id3决策树
clf=DecisionTreeClassifier(criterion='entropy')
#决策树训练
clf.fit(train_features,train_lables)
test_features=dvec.transform(test_features.to_dict(orient='record'))#测试集特征值矩阵
6、交叉验证
模型准确率需要考虑是否有测试集的实际结果可以做对比,当测试集没有真实结果可以对比时,需要使用 K 折交叉验证 cross_val_score;
#k折交叉验证
import numpy as np
from sklearn.model_selection import cross_val_score
#使用K折交叉验证 统计决策树准确率
print(u'cross_val_score准确率为%.41f'%np.mean(cross_val_score(clf,train_features,train_lables,cv=10)))
7、可视化
Graphviz 可视化工具可以很方便地将决策模型呈现出来,帮助你更好理解决策树的构建。
import graphviz
from sklearn.tree import export_graphviz
# 参数是回归树模型名称,不输出文件。
dot_data = export_graphviz(clf,out_file=None)
graph = graphviz.Source(dot_data)
# render 方法会在同级目录下生成 Boston PDF文件,内容就是回归树。
graph.view()
完整代码请笑纳~~~
# encoding=utf-8
import pandas as pd
#数据加载
train_data = pd.read_csv('./train.csv')
test_data = pd.read_csv('./test.csv')
#数据探索
print(train_data.info())#了解数据表基本情况:行数RangeIndex、列数Data columns、每列的数据类型、数据完整度;
print('_'*30)#分割线
print(train_data.describe())#了解数据表的统计情况:总数cout、平均数mean、标准差std、最小值min、最大值max等;
print('_'*30)#分割线
print(train_data.describe(include=['O']))#查看字符串类型(非数字)的整体情况O为大写的哦
print('_'*30)#分割线
print(train_data.head())#前30行的情况
print('_'*30)#分割线
print(train_data.tail())
#数据清洗
#缺失值为age年龄,fare船票价格,cabin船舱,Embarked为字符串
#1、使用平均年龄来填充年龄中的nan值
train_data['Age'].fillna(train_data['Age'].mean(),inplace=True)
test_data['Age'].fillna(test_data['Age'].mean(),inplace=True)
#2使用平均票价来填充票价中的nan值
train_data['Fare'].fillna(train_data['Fare'].mean,inplace=True)
test_data['Fare'].fillna(test_data['Fare'].mean,inplace=True)
#查看Embarked的字段取值
print(train_data['Embarked'].value_counts())
#使用最多的s港口补齐缺失值
train_data['Embarked'].fillna('S',inplace=True)
test_data['Embarked'].fillna('S',inplace=True)
#特征选择,出去无用信息
features=['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
train_features=train_data[features]
train_lables=train_data['Survived']
test_features=train_data[features]
#特征值里有一些字符串不方便计算,用DictVectorizer转换为字符串,如性别,可用1,2,代替male和female
from sklearn.feature_extraction import DictVectorizer
dvec=DictVectorizer(sparse=False)
train_features=dvec.fit_transform(train_features.to_dict(orient='record'))#训练集特征矩阵
print(dvec.feature_names_)
#决策树模型
from sklearn.tree import DecisionTreeClassifier
#构造id3决策树
clf=DecisionTreeClassifier(criterion='entropy')
#决策树训练
clf.fit(train_features,train_lables)
test_features=dvec.transform(test_features.to_dict(orient='record'))#测试集特征值矩阵
#决策树预测
pred_labels=clf.predict(test_features)
print(pred_labels)
#得到决策树准确率
# acc_decision_tree=round(clf.score(test_features,train_lables),6)
# print(u'score准确率为%.41f'%acc_decision_tree)
#k折交叉验证
import numpy as np
from sklearn.model_selection import cross_val_score
#使用K折交叉验证 统计决策树准确率
print(u'cross_val_score准确率为%.41f'%np.mean(cross_val_score(clf,train_features,train_lables,cv=10)))
import graphviz
from sklearn.tree import export_graphviz
# 参数是回归树模型名称,不输出文件。
dot_data = export_graphviz(clf,out_file=None)
graph = graphviz.Source(dot_data)
# render 方法会在同级目录下生成 Boston PDF文件,内容就是回归树。
graph.view()
数据存在百度云盘,可以自己练练手,理论不讲了。