MODE 众数
mean 均值
median 中位数
standard deviation 标准差
numpy:
import numpy as np array_1 = np.array([[1, 2], [3, 4]], float) array_2 = np.array([[5, 6], [7, 8]], float) print array_1 + array_2 print "" print array_1 - array_2 print "" print array_1 * array_2 array_1 = np.array([1, 2, 3], float) array_2 = np.array([[6], [7], [8]], float) print np.mean(array_1) print np.mean(array_2) print "" print np.dot(array_1, array_2)
np.dot
Pandas:
创建一个Series:
import pandas as pd series = pd.Series(['Dave', 'Cheng-Han', 'Udacity', 42, -1789710578]) print series
cuteness = pd.Series([1, 2, 3, 4, 5], index=['Cockroach', 'Fish', 'Mini Pig', 'Puppy', 'Kitten']) print cuteness > 3 print "" print cuteness[cuteness > 3]
创建一个数据框,DataFram
data = {'year': [2010, 2011, 2012, 2011, 2012, 2010, 2011, 2012], 'team': ['Bears', 'Bears', 'Bears', 'Packers', 'Packers', 'Lions', 'Lions', 'Lions'], 'wins': [11, 8, 10, 15, 11, 6, 10, 4], 'losses': [5, 8, 6, 1, 5, 10, 6, 12]} football = pd.DataFrame(data) print football
print football.dtypes print "" print football.describe() print "" print football.head() print "" print football.tail()
data = {'year': [2010, 2011, 2012, 2011, 2012, 2010, 2011, 2012], 'team': ['Bears', 'Bears', 'Bears', 'Packers', 'Packers', 'Lions', 'Lions', 'Lions'], 'wins': [11, 8, 10, 15, 11, 6, 10, 4], 'losses': [5, 8, 6, 1, 5, 10, 6, 12]} football = pd.DataFrame(data) print football['year'] print '' print football.year # shorthand for football['year'] print '' print football[['year', 'wins', 'losses']] #显示year,wins,losses,列 print football.iloc[[0]] #显示第一行 print football[3:5] print football[football.wins > 10] #打印wins大于10的数据 print football[(football.wins > 10) & (football.team == "Packers")]
'''Using the dataframe's apply method, create a new Series called avg_medal_count that indicates the average number of gold, silver, and bronze medals earned amongst countries''' avg_medal_count = df[['gold', 'silver','bronze']].apply(numpy.mean) #使用apply(numpy.mean)计算均值
df['points'] = df[['gold','silver','bronze']].dot([4, 2, 1]) olympic_points_df = df[['country_name','points']] #使用点积 计算 得分
精确率P,召回率R
P=TP/(TP+FP),
R=TP/(TP+FN),
TP 表示True Positive, FP表示False Positive。
FN 表示Flase Negative,TF表示True Negative。
偏差造成的误差 - 精度和欠拟合
如前所述,如果模型具有足够的数据,但因不够复杂而无法捕捉基本关系,则会出现偏差。这样一来,模型一直会系统地错误表示数据,从而导致预测精度低。这种现象叫做欠拟合(underfitting)。
简单来说,如果模型不适当,就会出现偏差。举个例子:如果对象是按颜色和形状分类的,但模型只能按颜色来区分对象和将对象分类(模型过度简化),因而一直会错误地分类对象。
或者,我们可能有本质上是多项式的连续数据,但模型只能表示线性关系。在此情况下,我们向模型提供多少数据并不重要,因为模型根本无法表示其中的基本关系,我们需要更复杂的模型。
方差造成的误差 - 精度和过拟合
在训练模型时,通常使用来自较大母体(训练集)的有限数量样本。如果利用随机选择的数据子集反复训练模型,可以预料它的预测结果会因提供给它的具体样本而异。在这里,方差(variance)用来测量预测结果对于任何给定的测试样本会出现多大的变化。
出现方差是正常的,但方差过高表明模型无法将其预测结果泛化到从中抽取训练样本的较大母体。对训练集高度敏感也称为过拟合(overfitting),而且通常出现在模型过于复杂或我们没有足够的数据支持它时。
通常,可以利用更多数据进行训练,以降低模型预测结果的方差并提高精度。
把数据集分为训练集和测试集
>>> import numpy as np >>> from sklearn import cross_validation >>> from sklearn import datasets >>> from sklearn import svm >>> iris = datasets.load_iris() >>> iris.data.shape, iris.target.shape ((150, 4), (150,))
>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split( ... iris.data, iris.target, test_size=0.4, random_state=0) >>> X_train.shape, y_train.shape ((90, 4), (90,)) >>> X_test.shape, y_test.shape ((60, 4), (60,)) >>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train) >>> clf.score(X_test, y_test) 0.96...
K折交叉验证
>>> import numpy as np >>> from sklearn.cross_validation import KFold >>> kf = KFold(4, n_folds=2) >>> for train, test in kf: ... print("%s %s" % (train, test)) [2 3] [0 1] [0 1] [2 3]
sklearn 中的 GridSearchCV
GridCV 用于系统地彻底检查参数调整的多种组合,并在确定哪次调整带来最佳性能时进行交叉验证。它的好处是,只需增加几行代码,就能彻底检查许多种组合。
下面是来自 sklearn 文档的一个示例(详见此处):
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svr = svm.SVC()
clf = grid_search.GridSearchCV(svr, parameters)
clf.fit(iris.data, iris.target)
让我们逐行进行说明。parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
参数字典以及您想尝试的可能的值。在这种情况下,他们在尝试找到内核(可能的选择为'linear'和'rbf')和C语言(可能的选择为1和10)的最佳方案。
这时,自动生产以下(内核、C语言)组合: [('rbf', 1), ('rbf', 10), ('linear', 1), ('linear', 10)]。各组合均用于训练SVM,并使用交叉验证对性能进行评估。
svr = svm.SVC()
这与创建分类器有点类似,就如我们从第一节课一直在做的一样。但是请注意,“clf”到下一行才会生成——这儿仅仅是在说采用哪种算法。另一种思考方法是,“分类器”在这种情况下不仅仅是一个算法,而是算法加参数值。请注意,这里不需对内核或C语言做各种尝试;下一行将处理这个问题。
clf = grid_search.GridSearchCV(svr, parameters)
这是第一个不可思议之处,分类器创建好了。 我们传达算法 (svr) 和参数字典来尝试 (参数) 而分类器则生成一个网格的参数组合进行尝试。
clf.fit(iris.data, iris.target)
第二个不可思议之处。 拟合函数现在尝试了所有的参数组合,并返回一个合适的分类器,自动调整至最佳参数组合。现在您便可通过clf.bestestimator.获得参数值。
参考此处的特征脸方法代码。使用 GridSearchCV 调整了 SVM 的参数?
'C':[1e3,5e3,1e4,5e4,1e5],
'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1]
项目概述
项目概述
在此项目中,我们将对为马萨诸塞州波士顿地区的房屋价格收集的数据应用基本机器学习概念,以预测新房屋的销售价格。您首先将探索这些数据以获取数据集的重要特征和描述性统计信息。接下来,您要正确地将数据拆分为测试数据集和训练数据集,并确定适用于此问题的性能指标。然后,您将使用不同的参数和训练集大小分析学习算法的性能图表。这让您能够挑选最好地泛化到未见过的数据的最佳模型。最后,您将根据一个新样本测试此最佳模型并将预测的销售价格与您的统计数据进行比较。
使用模型评估和验证 中的补充课程为此项目做准备。
项目亮点
此项目旨在让您熟练地在 Python 中处理数据集并使用 NumPy 和 Scikit-Learn 应用基本机器学习技术。在使用 sklearn 库中的许多可用算法之前,先练习分析和解释您模型的表现可能有所帮助。
通过完成此项目您将会学习(并最终知道)以下知识:
- 如何使用 NumPy 调查数据集的潜在特征。
- 如何分析各种学习性能图以了解方差和偏差。
- 如何确定用于从未看见的数据进行预测的最佳猜测模型。
- 如何评估模型使用之前的数据处理未看见数据的表现。
可在此处 找到可供下载的“boston_housing.py”旧版本。
项目描述
波士顿房屋市场竞争异常激烈,您想成为当地最好的房地产中介。为了与同行竞争,您决定使用几个基本的机器学习概念来帮助您和客户找到其房屋的最佳销售价格。幸运的是,您遇到了波士顿房屋数据集,其中包含大波士顿社区的房屋的各种特征的累积数据,包括其中各个地区的房屋价格的中值。您的任务是利用可用工具基于统计分析来构建一个最佳模型。然后使用该模型估算客户房屋的最佳销售价格。
对于此任务,请在下面的“可下载内容”部分中下载“boston_housing.ipynb”文件。虽然已经实现了某些代码以便于您开始操作,但您仍需要实现其他功能才能成功地回答 notebook 中包含的所有问题。可在以下幻灯片上找到包含的问题以供参考。除非我们要求,否则不要修改已包含的代码。
您还可以访问我们的项目 GitHub 以便访问此纳米学位的所有项目。
软件和库
对于此项目,您需要安装以下软件和 Python 库:
可交付成果
提交的文件中应包含以下文件并且可以打包为单个 .zip 文件:
- 包含完整实现且可正常运行的代码的“boston_housing.ipynb”文件,并已执行所有代码块和显示了输出。
- PDF 格式的项目报告(可以直接将 notebook 另存为包含答案的 PDF,或者提交只包含问题和答案的单独文档)。
可在此处 找到可供下载的“boston_housing.py”旧版本。
项目报告问题
可在此处 找到波士顿房屋数据集的描述。使用此幻灯片作为您在 notebook 中遇到的项目问题的参考。随附的 PDF 报告中必须包含这些问题(以及您的答案)。
统计分析与数据研究
此问题将整合到项目 notebook 输出中。
使用 NumPy 库计算有关此数据集的几个有意义的统计数据:
- 收集了多少个数据点(房屋)?
- 每所房屋存在多少个特征?
- 最低房屋价格是多少?最高价格是多少?
- 房屋价格的均值是多少?中间值是多少?
- 所有房屋价格的标准偏差是多少?
1) 在给定房屋的可用特征中,选择您认为比较重要的三个并简要描述它们衡量的方面。
2) 使用模板代码中客户的特征集“CLIENT_FEATURES”,哪些值与所选特征对应?
评估模型性能
3) 为什么要将数据拆分成训练和测试子集?
4) 下面哪个性能指标最适合预测房屋价格和分析错误?为什么?
- 准确率
- 精确率
- 召回率
- F1 分数
- 均方误差 (MSE)
- 平均绝对误差 (MAE)
5) 什么是网格搜索算法?它在哪些情况下适用?
6) 什么是交叉验证?对模型使用交叉验证的效果如何?为什么在使用网格搜索时,交叉验证会有帮助?
分析模型性能
7) 选择您的代码创建的学习曲线图之一。模型的最大深度是多少?当训练集大小增加时,训练误差会出现什么情况?描述测试误差出现的情况。
8) 查看最大深度分别为 1 和 10 的模型的学习曲线图。当模型使用完整训练集时,如果最大深度为 1,它是否会出现高偏差或高方差?最大深度为 10 时呢?
9) 根据模型复杂度图表,描述当最大深度增加时的训练和测试误差。根据您对图表的解读,哪个最大深度会促使模型最好地泛化数据集?为什么?
模型预测
为了回答以下问题,建议您多次运行 notebook 并使用中间值和均值作为结果。
10) 使用网格搜索时,模型的最佳最大深度是多少?此结果与您最初的直观印象相比如何?
11) 使用参数经过调整的模型,客户房屋的最佳销售价格是多少?此销售价格与您基于数据集计算的统计数据相比如何?
12) 用几句话讨论您是否会使用此模型预测客户在波士顿地区未来房屋的销售价格。
可在此处 找到可供下载的“boston_housing.py”旧版本。
coefficient of determination
参考 http://stattrek.com/statistics/dictionary.aspx?definition=coefficient_of_determination
from sklearn.metrics import r2_score def performance_metric(y_true, y_predict): """ Calculates and returns the performance score between true and predicted values based on the metric chosen. """ # TODO: Calculate the performance score between 'y_true' and 'y_predict' score = r2_score(y_true, y_predict) # Return the score return score
# TODO: Import 'make_scorer', 'DecisionTreeRegressor', and 'GridSearchCV' from sklearn.metrics import make_scorer from sklearn.tree import DecisionTreeRegressor from sklearn.grid_search import GridSearchCV def fit_model(X, y): """ Performs grid search over the 'max_depth' parameter for a decision tree regressor trained on the input data [X, y]. """ # Create cross-validation sets from the training data cv_sets = ShuffleSplit(X.shape[0], n_iter = 10, test_size = 0.20, random_state = 0) # TODO: Create a decision tree regressor object regressor = DecisionTreeRegressor() # TODO: Create a dictionary for the parameter 'max_depth' with a range from 1 to 10 params = {'max_depth' : range(1,11)} # TODO: Transform 'performance_metric' into a scoring function using 'make_scorer' scoring_fnc = make_scorer(performance_metric) # TODO: Create the grid search object grid = GridSearchCV(regressor, params, scoring_fnc, cv=cv_sets) # Fit the grid search object to the data to compute the optimal model grid = grid.fit(X, y) # Return the optimal model after fitting the data return grid.best_estimator_