利用多种方法来进行分类算法

浏览: 1655

前一段时间,作者利用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

每天都有进步。

推荐 0
本文由 数据取经团 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册