摘要:理解数据科学的工作流程,有助于我们合理有序地把控相关项目的开展。常见的整个过程包括:获取,检查和探索,清理和准备,建模,评估和最后的部署。
机器学习应用中的数据,可以来自不同的数据源,它可能是通过电子邮件发送CSV文件,也可能是从服务器中拉取的日志,或者它可能需要构建自己的Web爬虫。数据可能存在不同的格式,在大多数情况下,它是基于文本的数据……
访问数据常见的方式之一是通过REST风格的API接口,需要知道的库是 Python Request 库(http://www.python-requests.org/en/latest/)。它被称为给人类使用的HTTP,为API的交互提供了一个整洁和简单的方式。
让我们来看一个使用Requests进行交互的例子,它从Github的API中拉取数据:
import requests
r = requests.get(r'https://api.github.com/users/acombs/starred')
print (r.json())
一旦获得了数据,下一步就是检查和探索它们。一个良好的实践是在数据上运行一些简单的统计测试,并将数据可视化。
Pandas是一个卓越的数据分析工具。根据Pandas的文档(http://pandas.pydata.org/pandas-docs/stable/),使用示例如下 :
PATH = r'D:/iris/'
# 获得经典的机器学习数据集,CSV文件
r = requests.get('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data')
with open(PATH + 'iris.data', 'w') as f:
f.write(r.text)
# Change the current working directory to the specified path.
os.chdir(PATH)
# 给数据集赋与列名
df = pd.read_csv(PATH + 'iris.data', names = ['sepal length', 'sepal width', 'petal length', 'petal width', 'class'])
# 打印靠前行的数据框
print(df.head())
# 按条件过滤
print(df[(df['class']=='Iris-virginica') & (df['petal width'] >2.2) ])
# 得到更为详细的信息,包括 平均值、标准差……
print(df.describe())
Matplotlib是目前Python项目用得最多的绘图库,可用其创造图表,对数据进行可视化。Seaborn是专门为统计可视化而创建的库(http://seaborn.pydata.org/api.html),可以和pandas数据框完美地协作,找几个示例程序学习一下,很容易上手。
pandas的Series.map()、DataFrame.apply()、DataFrame.groupby()方法,对于处理数据而言是非常有价值的,而且在特征工程的机器学习场景下特别有用,以map()方法为例:
Map方法适用于序列数据,所以在我们的例子中将用它来转变数据框的某个列。假设我们觉得“类别”字段的名字太长了,并且希望使用特殊的3个字母代码系统对其进行编码。实现代码如下:
df['class'] = df['class'].map({'Iris-setosa': 'SET', 'Iris-virginica': 'VIR', 'Iris-versicolor': 'VER'})
print(df)
对于统计建模和机器学习,Python有许多很优秀的、文档详实的库供选择。scikit-learn是一个令人惊喜的Python库,作者们为其设计了无与伦比的文档,为几十个算法提供了统一的API接口。覆盖的一些领域包括:分类、回归、聚类、降维、模型选择和预处理。让我们看看一个例子——使用iris数据建立一个分类器,然后学习如何利用scikit-learn的工具来评估得到的模型:
clf = RandomForestClassifier(max_depth=5, n_estimators=10)
# 获取前4列数据
X = df.ix[:,:4]
# 获取“class”列的数据
y = df.ix[:,4]
# 将数据分成训练组和测试组
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.3)
# 训练
clf.fit(X_train, y_train)
# 运行、得到预测结果
y_pred = clf.predict(X_test)
# 输出预测值和实际值的对比
rf = pd.DataFrame(list(zip(y_pred, y_test)), columns=['predicted', 'actual'])
rf['correct'] = rf.apply(lambda r:1 if r['predicted'] == r['actual'] else 0, axis=1)
print(rf)
print(rf['correct'].sum()/rf['correct'].count())