前一段时间,作者利用Python进行了分类的数据挖掘算法,根据天善智能的《案例为师,实战为王》的课程代码,自己将泰坦尼克号的建模过程进行了整理,主要由回归分析,逻辑回归算法,决策树算法(参数选择),随机森林算法的Python代码实现进行了整合。
第一步:数据提取和描述性统计
在这一步中,Python中的一些简单函数可以起到很重要的作用,比如head,columns,describe等等,这些函数为后面数据的预处理等提供了很大的用处
具体的代码如下:
##加载Python库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
import sklearn
#读取泰坦尼克号的相关数据并进行描述性分析
titanic = pd.read_csv('C:\\Users\\lenovo\\Desktop\\python_study\\TS_ML\\3-9\\titanic\\titanic_train.csv')
##读取数据的列名
print(titanic.columns)#Pclass表示是几等舱,SibSp表示有无兄弟姐妹,Parch表示有无老人和孩子,Embarked表示在什么地方登船的,Survived
#对数据进行描述性统计
print(titanic.describe())
#观察数据的第一行数据
print(titanic.head(1))
第二步:数据的预处理
在这一步中,就开始进行数据的预处理工作,包括缺失值处理的fillna函数,哑变量处理的get_dummies函数等等,建议大家将这些函数整理在一起,这样便于归类的去处理
在这里,要着重说一下loc函数的用法,作为一个切片函数,其和.ix一样具有对数据框进行切片的功能
具体的代码如下:
#由上面可知,Age列的数据是存在缺失值的,因此可以通过中位数来对缺失值进行填补
#对缺失值进行填补,并且将分类数据用0和1来进行代替
titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median())
#下面对Sex这一列来进行处理,其中男性用0表示,女性用1表示
print(titanic['Sex'].unique())#['male' 'female']
#loc函数表示对标签来进行切片
titanic.loc[titanic['Sex'] == 'male', 'Sex'] = 0
titanic.loc[titanic['Sex'] == 'female', 'Sex'] = 1
#用同样的方法来对Embarked(在何处登船)来进行缺失值处理
print(titanic['Embarked'].unique())#['S' 'C' 'Q' nan]
#发现这个变量也有缺失值,需要对上面的数据来进行缺失值处理
titanic['Embarked'] = titanic['Embarked'].fillna('S')
titanic.loc[titanic['Embarked'] == 'S', 'Embarked'] = 0
titanic.loc[titanic['Embarked'] == 'C', 'Embarked'] = 1
titanic.loc[titanic['Embarked'] == 'Q', 'Embarked'] = 2
第三步:建模处理
1. 回归算法
#对变量进行建模,Survived作为因变量,为是否获救之意;下面建立分类模型,观察解释变量和被解释变量之间的关系,并且比较不同分类算法的效果如何
from sklearn.linear_model import LinearRegression#引入线性回归模型
from sklearn.cross_validation import KFold
#来选择一些变量来进行处理
predictors = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
#初始化线性回归的函数
alg = LinearRegression()
#建立三折交叉验证,titanic.shape[0]表示的是数据框的行数
kf = KFold(titanic.shape[0], n_folds=3, random_state=1)
#建立一个空列表存放预测得分值
predictions = []
##建模的流程包括自变量、因变量的建立,拟合为线性模型,进行预测,将评分append到列表中
for train, test in kf:
train_predictors = titanic[predictors].iloc[train,:]#建模数据中的自变量
train_target = titanic['Survived'].iloc[train]#建模数据中的因变量
alg.fit(train_predictors, train_target)#建立线性回归模型
test_predictions = alg.predict(titanic[predictors].iloc[test,:])#对数据进行预测
predictions.append(test_predictions)#将预测得分全部放在predictions列表中
#对模型的准确性来进行评估
predictions = np.concatenate(predictions, axis=0) #将列表变成一列数据
predictions[predictions > 0.5] = 1 #将预测概率大于0.5的设置为1
predictions[predictions <= 0.5] = 0 #将预测概率小于0.5的设置为0
accuary = sum(predictions[predictions == titanic['Survived']]) / len(predictions) #计算正确率
print(accuary)
2. 逻辑回归
#利用逻辑回归来建立模型
from sklearn.linear_model import LogisticRegression
from sklearn.cross_validation import KFold
from sklearn.cross_validation import cross_val_score
#初始化逻辑回归
alg = LogisticRegression()
#计算精确率
scores = cross_val_score(alg, titanic[predictors], titanic['Survived'], cv=3)
#通过交叉验证评估得分,得到一个得分列表
print(scores.mean())
3. 随机森林
#建立随机森林模型
from sklearn import cross_validation
from sklearn.ensemble import RandomForestClassifier
from sklearn.cross_validation import cross_val_score
#来选择一些变量来进行处理
predictors = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
#使用默认参数初始化我们的算法
#n_estimators是我们想要制作的树的数量
#min_samples_split是我们需要进行拆分的最小行数
#min_samples_leaf是我们可以在树分支结束的地方的最小样本数(树的底点)
#表示每次进行决策树都是选择了这些样本
alg = RandomForestClassifier(random_state=1, n_estimators=10, min_samples_split=2, min_samples_leaf=1)
#提供训练/测试指标,用于在训练测试仪中分割数据。 将数据集拆分成k个连续折叠(默认情况下不进行混洗)。
#然后将每个折叠用作验证集一次,而k-1个剩余折叠形成训练集,(k-1折作为训练数据,1折作为验证数据集)
#进行了三折交叉验证
kf = cross_validation.KFold(titanic.shape[0], n_folds=3, random_state=1)
print(len(kf))
scores = cross_val_score(alg, titanic[predictors], titanic['Survived'], cv=kf)
print(scores.mean())
4. 决策树
#利用决策树算法来进行处理
from sklearn.cross_validation import train_test_split
#读取自变量和因变量的值
all_inputs = titanic[predictors].values
all_classes = titanic['Survived'].values
#利用train_test_split函数对数据进行抽取,抽取75%的数据为建模数据,25%的数据为测试数据
(training_inputs, testing_inputs,
training_classes, testing_classes) = train_test_split(all_inputs, all_classes, train_size=0.75, random_state=1)
#利用决策树算法来进行建模
from sklearn.tree import DecisionTreeClassifier
decision_tree_classifier = DecisionTreeClassifier()
decision_tree_classifier.fit(training_inputs, training_classes)
decision_tree_classifier.predict(testing_inputs)
decision_tree_classifier.score(testing_inputs, testing_classes)
#通过决策树算法来进行交叉验证
from sklearn.cross_validation import cross_val_score
#建立一个决策树的函数
decision_tree_classifier = DecisionTreeClassifier(max_depth=4, max_features=5)
#建立一个十折的交叉验证
cv_scores = cross_val_score(decision_tree_classifier, all_inputs, all_classes, cv=10)
print(cv_scores)
print(cv_scores.mean())
#获取决策树的最佳参数
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import StratifiedKFold
decision_tree_classifier = DecisionTreeClassifier()
parameter_grid = {'max_depth':[1, 2, 3, 4, 5],
'max_features':[1, 2, 3, 4, 5, 6, 7]}
#一定要注意StratifiedKFold需要的是y,但是KFold需要的是行数,也就是shape[0]即可
cross_validation = StratifiedKFold(all_classes, n_folds=10)
grid_search = GridSearchCV(decision_tree_classifier,
param_grid=parameter_grid,
cv=cross_validation)
grid_search.fit(all_inputs, all_classes)
print('Best estimator: {}'.format(grid_search.best_estimator_))
print('Best score: {}'.format(grid_search.best_score_))
print('Best parameter: {}'.format(grid_search.best_params_))
另外,在学校sklearn库的时候,强烈建议大家将机器学习的库放在手边,具体网址如下:
http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html
每天都有进步。