Evan 2018-09-04
Scikit-Learn构建于NumPy,SciPy和matplotlib之上。它包含大量即用型机器学习算法。所有算法都有详细记录,易于使用,适用于所有经验级别。
Scikit-Learn机器学习库包含许多强大的算法,每个算法都有自己的对象,具有一定的参数和方法。
打开命令行并输入
pip install scikit-learn
我鼓励所有用户下载 Anaconda的Python发行版,这些软件已经安装了所有数学和科学库。
scikitlearn被分成了几个主题:分类、回归、聚类、降维、模型选择和预处理。
前三个主题(分类、回归和聚类)都是各种类型的算法。虽然后三个(维度减少、模型选择和预处理)是修改和分析数据的主题,但是当它被输入到一个算法时,它会更好地工作。本文主要关注前三个主题。
监督学习
分类和回归算法都属于称为“监督学习”的机器学习部分。这意味着这两种类型的算法有一些共同之处:输入算法的数据具有观测数据和目标(或结果或“答案”)。
一个标准的例子是房屋数据及其销售价格。观察数据是每个访问的特征。目标是房屋在市场上的价格。
然后,只要我们有关于它的特征,我们就可以使用监督学习来预测任何房屋的价格。
分类数据意味着目标值是离散的(例如将房屋标记为昂贵或便宜)
回归意味着结果是连续的(房屋的实际价格以美元计算,可以是任何正数)。
无监督学习
聚类部分也称为“无监督学习”。这意味着我们有观测数据,但没有目标。相反,我们希望使用一种算法来查找观察数据中的组并创建标签。一个常见的例子是销售或流量数据中的用户细分。
首先,您需要检查数据是否适合分类,回归或聚类方案。然后转到Scikit-Learn的相应部分并选择算法。如前所述,每个算法都是它自己的对象。
我们将从一个非常简单的示例开始,以便了解库:线性回归。
我们将使用Scikit-Learn的内置数据集之一作为使用此模型创建,拟合和预测的演练。
注意:这 不是对线性回归的深入分析,只是一个简单的例子。
Python代码如下:
from sklearn import datasets
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# Load the data (as NumPy arrays)
observations, target = datasets.load_diabetes(return_X_y=True)
# Initialize the algorithm object
regression_model = LinearRegression()
通常,您将使用所需的参数初始化算法对象。很多人都有默认设置,就像我们在这里看到的那样。但是,我建议研究每个参数的含义,以确保您做出了正确的选择。
我们将把数据放入一个pandas DataFrame中,以便将数据分成训练和测试集,Python代码如下:
# Make pandas DataFrames
observational_data = pd.DataFrame(data=observations)
target_data = pd.DataFrame(data=target)
# Separate out training and testing sets of data
test_index = 400
train_X = observational_data.iloc[:test_index]
test_X = observational_data.iloc[test_index:]
train_Y = target_data.iloc[:test_index]
test_Y = target_data.iloc[test_index:]
现在我们准备好拟合这个模型。
.fit方法
我将使用.fit方法获取训练数据并将其放入线性回归算法中。该方法将计算最适合数据的基础线性方程。
regression_model.fit(train_X, train_Y)
.predict方法
为了评估我们的算法能够仅基于观测数据进行预测的程度,我们使用.predict方法。我们将使用观测数据的测试集来进行预测。
predictions = regression_model.predict(test_X)
然后通过查看R2和MSE指标,了解这些预测与实际目标的对比情况。
print "R2 is", r2_score(test_Y, predictions)
>>> R2 is 0.69857490094
print "Mean Square Error is", mean_squared_error(test_Y, predictions)
>>> Mean Square Error is 1668.74966759
我们将跳过检查残差图,并查看这些指标。指标告诉我们这个模型没问题。我们能够用我们的模型解释目标中约70%的变化。如果我们在观察数据中使用不同的列组合运行此模型,则均方误差度量将帮助我们比较模型。
你已经看到这个库有算法对象,每个都有一个fit方法。如果您使用的算法是回归或分类算法,它还将具有预测方法。
让我们将我们刚才所做的演练应用到现实生活中的比特币场景中。我们将获得有关比特币的数据,并为比特币价格跌至30天平均水平以下的价格创造了一个信号。
假设我们是一个谨慎的投资者,因此观察30天滚动平均值并不是一个足够好的分析。有没有更好的方法来检查市场行为?
我曾经遇到过一个利用聚类来帮助交易者可视化类似市场行为的金融产品。我认为这很有趣,因为使用监督学习建立准确的模型通常需要数据超出普通人的范围。聚类允许任何人找到他们可用的模式。
那么让我们看看我们是否可以利用Clustering来发现比特币价格的模式。我从Quandl获得一个小比特币数据集(你需要一个帐户)。该数据集包含约3个月的比特币价格。我选择了这个数据集,因为它有市场开盘价和收盘价。
让我们看看市场开盘时是否存在基于比特币价格的市场高点和低点组合。
以下是我们需要的库:
import quandl
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
这是我设置数据的Python代码:
# Set up the Quandl connection
api_key = 'GETYOURAPIKEY'
quandl.ApiConfig.api_key = api_key
quandl_code = "BCHARTS/BITFLYERUSD"
# Get the bitcoin data
bitcoin_data = quandl.get(quandl_code, returns="numpy", end_date="2018-08-23")
# Put bitcoin data into pandas DataFrame
columns = ['Date','Open','High','Low','Close','Volume (BTC)','Volume (Currency)','Weighted Price']
bitcoin = pd.DataFrame(data=bitcoin_data, columns=columns)
bitcoin = bitcoin.dropna() # drop blanks!
这是一个用于制作检查数据所需的可视化的函数,Python代码如下:
def make_jpg(color, filename, y_column_name):
# make figure
fig = plt.figure(figsize=(8,5), dpi=100)
# add axes at specific position
position = [0.1, 0.1, 0.8, 0.8]
axes = fig.add_axes(position)
# scatter plot
x_column_name = "Open"
X = bitcoin[x_column_name]
Y = bitcoin[y_column_name]
axes.scatter(X, Y, color=color)
axes.set_xlabel(x_column_name)
axes.set_ylabel(y_column_name)
axes.set_title("{0} vs {1}".format(x_column_name, y_column_name))
axes.grid(b=True)
fig.savefig(filename)
以下是我们的数据:
现在这是一个线性关系,使用这些数据构建超精确回归模型需要相当多的其他数据点,所以让我们坚持使用聚类算法告诉我们的内容。
Scikit-Learn有许多可用的聚类算法。我们将使用DBSCAN,因为我们不知道应该有多少clusters,我们希望关注具有数据点集中的区域。您可以根据您希望如何构建策略来使用其他聚类算法。
这是为Open和High以及Open vs Low数据构建聚类算法的Python代码:
def learn(y_column_name):
# make visualization before learning process
filename1 = "Bitcoin Open v {0}.jpg".format(y_column_name)
make_jpg("blue", filename1, y_column_name)
# ML algorithm
dbscan = DBSCAN(eps=150)
dbscan.fit(bitcoin.loc[:, ["Open", y_column_name]])
# take out the lables
labels = dbscan.labels_
# make visualizations
if y_column_name == 'High':
color_map = {-1: "k", 0: "r", 1: "orange", 2: "y"}
else:
color_map = {-1: "k", 0: "g", 1: "b", 2: "purple", 3: "cyan"}
colors = [color_map[l] for l in labels]
# store the labels colors
bitcoin['vs {0} Labels'.format(y_column_name)] = colors
filename2 = "Bitcoin Open v {0} Learn.jpg".format(y_column_name)
make_jpg(colors, filename2, y_column_name)
return dbscan
high_dbscan = learn("High")
low_dbscan = learn("Low")
Epsilon:两个数据点之间的最大距离是多少,以便它们仍然在同一个聚类中。我为这个价值选了150美元。
那我们发现了什么?
我们的clusters是具有类似的市场行为。黑点是不属于cluster的异常值。
让我们看看每个cluster,找出High/Low price 和Open price之间的平均偏差。
bitcoin["Open vs High Diff"] = bitcoin['High'] - bitcoin['Open']
print bitcoin.groupby('vs High Labels')["Open vs High Diff"].mean()
>>> vs High Labels
black 312.500000
orange 139.954200
red 82.933571
yellow 48.316000
bitcoin["Open vs Low Diff"] = bitcoin['Open'] - bitcoin['Low']
print bitcoin.groupby('vs Low Labels')["Open vs Low Diff"].mean()
>>> vs Low Labels
black 359.137222
blue 104.825000
cyan 107.212857
green 124.174286
purple 113.181282
上面的结果告诉我们,如果有一天市场开盘的比特币价格在6,500美元左右,类似的数据点看到平均高价+ 139美元和低价 - 当天开盘价113美元。
那么现在怎么办?下一步是可以将我们学到的东西放入一个自动测试和执行交易策略的系统中。