xiongpai 2018-04-02
您可能会使用许多用于分析数据的统计测试来假设数据将遵循的概率分布。有许多不同的概率分布,但其中最常见的是正态分布,有时也称为高斯分布或贝尔曲线。
有两个参数与正态分布相关。平均值(μ)和标准偏差(σ)。这两个参数插入描述高斯分布的概率密度函数。正态分布的平均值是对称的。了解正态分布将有助于理解下面将要看到的参数测试。
我们可能用来比较两组数据的最常见参数测试之一是t检验。t检验允许检查两组数据之间是否存在显着差异。这是描述性和推论性统计之间的区别。有了描述性的统计数据,如平均数,你只能描述我们有的样本,但除此之外我们不能一概而论(例如,如果我将一个硬币翻转10次,得到7个头,并且一个朋友得到5个头,意味着我更有可能成为头顶,我们不能说我会一直得到更多的头)。推理统计,就像t检验一样,不仅仅描述了我们所拥有的样本,而且也告诉我们我们可以从我们没有的样本中得到什么。它使我们能够概括我们正在测试的样本。t检验只是衡量组间差异,并将其与组内差异进行比较。t值越小,组越相似,相反,t值越大,组的差异越大。当我们想比较两个不同的样本测试时,我们执行两个样本的t检验。我们将讨论这个叫做的变体韦尔奇的t检验不假设样本量相等或方差相等。在韦尔奇的t检验中,我们使用下面的等式计算t统计量。
我们还需要使用以下公式估计自由度(ν)的数量。
一旦我们有了这两个值,我们就可以估计p值。p值是获得检验统计量的概率,至少与实际观察到的一致。如果p值= 0.05,这意味着t值大于或等于5%的概率。t检验的目标是接受或拒绝零假设。无效假设是我们试图通过运行测试来反驳的一种说法。进行统计测试时,我们通常会设置一个临界值。如果p值<p临界值,那么我们将拒绝零假设。
计算p值可能很乏味,谢天谢地,有一种简单的方法可以在Python中实现。让我们将这个应用于一个例子。我们想确定右手和左手棒球击球手的表现是否存在差异。
首先,我们需要将棒球数据集加载到pandas 中
import scipy.stats
import pandas as pd
# Read data into into pandas dataframe
df = pd.read_csv(filename)
print (df.head())
name handedness height weight avg HR
0 Brandon Hyde R 75 210 0.000 0
1 Carey Selph R 69 175 0.277 0
2 Philip Nastu L 74 180 0.040 0
3 Kent Hrbek L 76 200 0.282 293
4 Bill Risley R 74 215 0.000 0
然后我们分割数据来比较我们的两个子集(右手和左手)
# Split the data between right-handed and left-handed batters
right_handed = df[df.handedness == ‘R’]
left_handed = df[df.handedness == ‘L’]
print (right_handed.head())
print (left_handed.head())
我们使用ttest_ind()函数执行t检验。当指定equal_var = False时,我们表明我们是否认为两个样本的方差是相等的。这equal_var = false参数使得t检验的这个特定调用等于韦尔奇的t检验。这个函数将返回一个元组。第一个值是数据的t值。第二个值是双尾测试的相应p值。该函数返回的值假定我们正在执行双侧t检验,我们只测试两个样本的平均值是否不同。
我们选择p-critical = 0.05,这意味着如果p值<0.05,我们会拒绝零假设,我们可以说右手和左手击球手之间没有显着差异。
# Perform the Welch’s t-test
result = scipy.stats.ttest_ind(right_handed[‘avg’], left_handed[‘avg’], equal_var=False)
print (result)
# Reject or accept null hypothesis
def validation_null_hypothesis(p-value)
if p-value <= 0.05:
print ("There is a significant difference")
return False
else:
print ("No significant difference")
return True
validation_null_hypothesis(result[1])
Ttest_indResult(statistic=-9.935702226242094, pvalue=3.810274225888738e-23)
There is a significant difference
False
进行t检验时,我们假设我们的数据是正常的。但是我们也可能遇到不正常的概率分布。在这种情况下,我们必须使用其他统计测试。如果我们不确定,我们首先需要确定我们的数据是否正常。该夏皮罗,威尔克测试测量样本从正态分布的人口中抽取的可能性。shapiro()函数返回两个值。首先是Shapiro-Wilk测试统计。第二个值是我们的p值,应该按照我们将解释t检验的p值的方式解释。也就是说,假设这个数据是从正态分布中得出的零假设,那么我们会观察到至少和我们看到的一样极端的夏皮罗 - 威尔克检验统计量的值的可能性是多少?
import scipy.stats
# w : Shapiro-Wilk Test statistic
# p : p-value
w, p = scipy.stats.shapiro(data)
比方说,我们只是确定我们的数据是非正常的,仍然有一些非参数测试可以用来比较两个样本。非参数测试是一种统计测试,不会假定我们的数据是从任何特定的基础概率分布中抽取的。一个这样的测试是Mann-Whitney U测试,有时也被称为Mann-Whitney Wilcoxon测试。这是对两个总体相同的零假设的检验。mannwhitneyu()函数返回两个值,Mann-Whitney检验统计量和此测试的单向p值。
import scipy.stats
# u : Mann-Whitney test statistic
# p : p-value
u, p = scipy.stats.mannwhitneyu(x, y)
这些只是我们在对数据进行统计测试时可以使用的一些方法。正如您可以想象的那样,还有许多其他方法可以处理来自不同概率分布或数据的数据,这些数据看起来好像不是来自任何概率分布。数据科学家可以执行许多统计程序。但了解数据集的基本结构以及因此,根据我们所掌握的数据,哪些统计测试是适当的,这一点至关重要。
现在我们知道要分析现有数据,我们可以看看是否有办法对数据进行预测。
机器学习是人工智能的一个分支,专注于构建从大量数据中学习以进行预测的系统。但统计和机器学习有什么区别?
总之,答案并不多。越来越多,这两个领域正在趋同,他们共享许多相同的方法。然而,这两个主题之间存在一些重大的哲学差异。一般而言,统计学侧重于分析现有数据,得出有效的结论,而机器学习侧重于做出预测。这转化为以下内容:在统计数据中,我们非常关心如何收集数据,并使用概率模型得出有关现有数据的结论。例如,我们可能会试图回答这个问题:左手击球手统计上比右手控球手好吗?在机器学习的情况下,如果有一种更精确的方法根本不使用它们,我们会更专注于做出准确的预测,而不太愿意使用概率模型。只要我们的机器学习方法能够持续地做出准确的预测,例如玩家击中了多少次本垒打,我们并不太担心模型的假设。
有许多不同类型的机器学习问题,但两种常见的有监督学习和无监督学习。机器学习通常涉及生成关于我们试图解决的问题的某种类型的模型。我们会将数据提供给这个模型,然后尝试做出预测。在有监督的学习中,有标记的输入,我们训练我们的模型。培训我们的模型韦尔奇的试验意味着教授模型答案是什么样子。监督式学习的一个例子就是估算新房子的成本,因为我们有很多例子,我们知道一些特征,如平方英尺,房间数量或位置。我们也知道这个房子卖了多少钱。鉴于我们知道所有相同的参数,我们可以训练一个模型,然后预测未来的房子将出售多少。这是回归的一个例子。
在进行无监督学习时,我们没有任何这样的训练例子。相反,我们有一堆未标记的数据点,我们试图通过将相似的数据点聚类在一起来理解数据的结构。例如,如果我们要为一组照片提供无监督的学习算法,可能会将照片分成组,比如人物照片,马匹照片,建筑物照片等,而不会事先告知这些组应该是什么。它可能不知道这些团体是人,马或建筑物,但它可以说明存在这些不同的团体。
回到我们的棒球数据集,我们想创建一个模型,预测一个不在我们数据集中的球员的本垒打数量。我们能够解决这个问题的一种方法是使用线性回归,机器学习的一个基本实现是通过使用梯度下降来执行线性回归。
进行线性回归时,我们通常会有一些数据点(下面的fidure中的1到m)。每个数据点都有一个输出变量(Y),然后有一些输入变量(X1到Xn)。所以在我们的棒球的例子中,Y这里是本垒打的终生数量,而我们的X1到Xn是他们的身高和体重。
目标是建立一个模型,通过将输入变量乘以一组系数(θ1至θn),为每个数据点预测输出变量的值。我们称每个θ为我们模型的参数或权重。它表明预测输出变量Y的某个输入变量X是多么重要。这个模型的构建方式是我们将每个X乘以相应的θ,并将它们相加得到Y.从您可以看到等式中,θ越小,则θ和X的乘积越小,反之则越小。计算θ时,对于预测Y不太重要的输入X很小,对于那些大贡献者来说是很大的。最好的方程是最小化我们预测的Y与我们观察到的Y之间的所有数据点差异的方程。梯度下降。
为了做梯度下降,我们首先需要定义下面的成本函数J(θ)。
成本函数旨在衡量我们当前的θs在建模数据方面的表现。所以我们想要最小化成本函数的价值。如上图所示,成本函数只是平方误差总和的一半。请注意,x上标i表示我们的所有x的集合。所以Y预测的结果等于所有x和θ的乘积之和,正如我们在上面看到的两个数字一样。
那么我们如何找到正确的θ值来最小化我们的成本函数J(θ)?梯度下降是一种对θ进行一些初始猜测并迭代地改变θ的算法; 使得J(θ)保持越来越小直到收敛到某个最小值。
现在让我们实现梯度下降算法的基本功能,以在小数据集中查找边界。首先,我们将从plot_line()函数开始,它将帮助我们绘制和可视化数据。请注意,gradient_descent()函数将alpha作为参数。阿尔法被称为学习率,并基本上设置每次迭代的步骤。在更新权重方面迈出一大步可以让你超越权利等式。另一方面,采取小步骤可以增加达到收敛所需的迭代次数。它通常需要一个微调过程来找到合适的平衡点。
import numpy as np
from matplotlib import pyplot as plt
def plot_line(y_prediction, features, color):
x_values = [i for i in range(int(min(features))-1, int(max(features))+1)]
y_values = [y_prediction(x) for x in x_values]
plt.plot(x_values, y_values, color)
def predicted_y(features, weight, bias):
return np.dot(features, weight) + bias
def error_bias_calculation(features, targets, weight, bias):
error = sum(predicted_y(features, weight, bias) - targets)
return error / len(features)
def error_weight_calculation(features, targets, weight, bias):
error = sum((predicted_y(features, weight, bias) - targets) * features)
return error / len(features)
def update_weights(features, targets, weight, bias, alpha):
error_bias = error_bias_calculation(features, targets, weight, bias)
error_weight = error_weight_calculation(features, targets, weight, bias)
weight = weight - alpha * error_weight
bias = bias - alpha * error_bias
return weight, bias
def cost_calculation(features, targets, weight, bias):
sum_of_square_errors = sum(np.square(predicted_y(features, weight, bias) - targets))
cost = sum_of_square_errors / (2 * len(features))
return cost
def gradient_descent(features, targets, epochs, alpha):
# Initialize random weight and random bias
weight = 0
bias = 0
# Line at initial position (in blue)
y_prediction = lambda x: weight * x + bias
plot_line(y_prediction, features, 'b')
plt.plot(features, targets, 'bo')
plt.show()
for i in range(epochs):
# Update weight and bias of the line
weight, bias = update_weights(features, targets, weight, bias, alpha)
# every 10 iteration, print Cost for each epoch
# and a doted green line for the updated line
if i % 10 == 0:
plot_line(y_prediction, features, 'g--')
print("========== Epoch", i, "==========")
print "Cost: ", cost_calculation(features, targets, weight, bias)
# draw the last line in red
plot_line(y_prediction, features, 'r')
plt.plot(features, targets, 'bo')
plt.show()
# Create small dataset
features = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
targets = [2, 4, 2, 4, 6, 6, 5, 8, 9, 8]
plt.plot(features, targets, 'bo')
plt.show()
gradient_descent(features, targets, epochs=100, alpha=0.001)
数据集应该如下所示:
我用蓝色绘制了初始化的线。这条线通常是随机设置的
每10次迭代 请记住,成本应该始终下降,直到达到最低点(收敛)。
('========== Epoch', 0, '==========')
Cost: 16.004954
('========== Epoch', 10, '==========')
Cost: 7.52057727374
('========== Epoch', 20, '==========')
Cost: 3.71424722592
('========== Epoch', 30, '==========')
Cost: 2.0064263714
('========== Epoch', 40, '==========')
Cost: 1.23996949709
('========== Epoch', 50, '==========')
Cost: 0.895797093343
('========== Epoch', 60, '==========')
Cost: 0.741057191151
('========== Epoch', 70, '==========')
Cost: 0.671295578372
('========== Epoch', 80, '==========')
Cost: 0.639655519089
('========== Epoch', 90, '==========')
Cost: 0.625117716849
随意使用此代码并以不同的方式调整参数。您可以更改时期,学习速率(alpha),更改数据集...