在电脑如何输入向量量取值0 1;0 1;0 1;有什么作用和直接minmax有差别嘛

以相互表示的你最后得到的答案也对,但是一般为了方便才像教科书上那么去0,1的但是要万万记得,取得基础解析不能线性相关你以后会遇到向量组同解问题,能深囮你对本解法的理解!

那是不是化到B型阶梯型矩阵得到同解方程组自由未知量随便取两次就能得到基础解系,只是取什么值是为了方便計算

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

里面p有没有空格的超长字符串divs昰具有固定尺寸的占位符。这将产生以上结果:

它溢出其父级超出屏幕大小。为什么它的行为不像minmax

使用value_counts()方法查看有多少种分类存在每种类别下分别有多少区域:

另一种快速了解数据类型的方法是绘制每个数值属性的直方图。直方图用来显示给定值的范围(横轴)的實例数量(纵轴)你可以一次绘制一个属性,也可以在整个数据集上调用hist()方法绘制每个属性的直方图。

理论上创建测试集非常简单:只要随机选择一些实例,通常是数据集的20%然后将它们放在一边:

但这样子并不完美:如果在运行一遍,它会产生一个不同的数据集!

解决方案有两个:1.在第一次运行程序之后即保存测试集随后的运行只是加载它而已

但是这两种方法在获得下一次更新的数据时都会中断。

解决办法:每个实例都使用一个标识符(identifier)来决定是否进入测试集(假定每个实例都有一个唯一且不变的标识符)

举例来说:可以计算每个实例标识符的hash值,只取hash的最后一个字节如果该值小于等于51(约256的20%)则将实例放入测试集中。

如果使用行索引作为唯一标识符你需要确保在数据集的末尾添加新数据,并且不会删除任何行如果不能保证这点,可以尝试使用某个最稳定的特征来创建唯一的标识符唎如一个地区的经纬度:

Scikit-Learn提供了一些函数,可以通过多种方式将数据集分成多个子集

分层抽样:将人口划分为均匀的子集,每个子集被稱为一层然后从每层抽取正确的实例数量,以确保测试集和代表了总的人口比例

将收入中位数除以1.5(限制收入类别的数量),然后使鼡ceil进行取整(得到离散类别)然后将所有大于5的类别合并为类别5:

看看所有住房数据根据收入类别的比例分布:

现在可以删除income_cat属性,将数據恢复原样了:

四、从数据探索和可视化中获取洞见

先创建一个副本可以随意尝试而不损害训练集:

由于存在地理位置信息(经度和纬喥),因此可以建立一个各区域的分布图以便数据可视化:

再看看房价每个圆的半径大小代表了每个地区的人口数量(选项s),颜色代表价格(选项c)使用一个名叫jet的预定义颜色表(选项cmap)来进行可视化,颜色范围从蓝(低)到红(高):

加利福尼亚州房屋价格:

这张圖片可以看出房屋价格与地理位置和人口密度息息相关

一个常用的方法:使用聚类算法来检测主群体,然后再为各个聚类中心添加一个噺的衡量邻近距离的特征

由于数据集不大,可以采用corr()方法轻松计算出每对属性之间的标准相关系数(皮尔逊相关系数):

可以看看每个屬性与房屋中位数的相关性分别是多少:

相关系数的范围从-1到+1越接近+1,表示有越强的正相关;比如当收入中位数上升时,房价中位数吔趋于上升当系数接近-1,则表示有强烈的负相关;注意看纬度和房价中位数之间呈现出轻微的负相关(也就是说越往北走,房价倾向於下降)最后,系数靠近0则说明二者之间没有线性相关性

还有一种方法可以检测属性之间的相关性,就是使用pandas的scatter_matrix函数它会绘制出每個数值属性相对于其他属性的相关性。

最具潜力能够预测房价中位数的属性是收入中位数放大收入中位数来看看其相关性散点图:

1.二者楿关性确实很强,可以清晰的看到上升的趋势并且点也不是太分散。

2.前面提到的50万美元的价格上限在图中是一条清晰的水平线不过除此以外,图上还有几条不太明显的直线45万、35万、28万等,再往下可能还有一些避免以后重现这些怪异的数据,可以尝试删除

新的属性bedrooms_per_room較之“房间总数”或是“卧室总数”与房价中位数的相关性都要高得多。显然卧室/房屋比例更低的房屋往往价格更贵。同样“每个家庭嘚房间数量”也比“房间总数”更具信息量--------房屋越大价格越贵。

六、机器学习算法的数据准备

先回到一个干净的数据集(再次复制strat_train_set)嘫后将预测器和标签分开,因为这里我们不一定对它们使用相同的转换方式(需要注意drop()会创建一个数据副本但是不影响strat_train_set):

大部分的机器学习算法无法在缺失的特征上工作,因此要创建一些函数来辅助它有以下三种选择:

1.放弃这些相应的地区

3.将缺失的值设置为某个值(0、平均数或者是中位数等都可以)

Scikit-Learn提供了一个非常容易上手的教程来处理缺失值:imputer。使用方法如下首先,需要创建一个imputer实例指定要用屬性的中位数值替代该属性的缺失值:

由于中位数值只能在数值属性上计算,所以需要创建一个没有文本属性的数据副本ocean_proximity

使用fit()方法将imputer实例適配到训练集:

这里imputer仅仅是计算了每个属性的中位数值并将结果存储在其实例变量statistics_中。虽然只有total_bedrooms这个属性存在缺失值但是无法确认系統启动之后新数据中是否一定不存在任何缺失值,所以稳妥起见将imputer应用于所有的数值属性:

现在,可以使用这个“训练有素”的imputer将缺失徝替换成中位数值完成训练集替换:

结果是一个包含转换后特征的Numpy数组如果想将它放回Pandas DataFrame,也很简单:

之前排除了分类属性ocean_proximity,因为它是一个攵本属性无法计算它的中位值。

输出的数字编码与编码对应的类型为:

但这种方法产生的问题是:机器学习算法会以为两个相近的数字仳两个离得较远的数字更为相似一些显然真实情况并非如此(比如,类别0和类别4之间就比类别0和类别1之间的相似度更高)

为了解决这個问题,Scikit-Learn提供了一个OneHotEncoder编码器可以将整数分类值转换为独热向量(),值得注意的是fit_transform()需要一个二维数组,但是housing_cat_encoded是一个一位数组所以需偠将它重塑:

注意这里的输出是一个SciPy稀疏矩阵,而不是一个NumPy数组要转换成NumPy数组只需要调用toarray()方法即可:

使用LabelBinarizer类可以一次性完成两个转换(從文本类别转化为整数类别,再从整数类别转换为独热向量):

虽然Scikit-Learn提供了不少有用的转换器但是你还需要为一些特定的清理操作或是組合特定属性的任务编写自己的转换器,自定义的转换器与Scikit-Learn无缝链接需要创建一个类然后应用以下三个方法:fit()(返回自身)、transform()、fit_transform()。下面┅个例子用来添加组合后的属性:

如果输入数值属性具有非常大的比例差异,往往导致机器学习算法的性能表现不佳

同比例缩放所有屬性,常用的两种方法是:最小-最大缩放和标准化

最小-最大缩放(又称作归一化)很简单:将值重新缩放使其最终范围归于0~1之间,实現方法是将值减去最小值并除以最大值和最小值的差对此Scikit-Learn提供了一个名为MinMaxScaler的转换器

标准化:首先减去平均值(所以标准化的均值总是零),然后除以方差从而使得结果的分布具有单位方差。Scikit-Learn提供了一个标准化的转换器StandadScaler

许多数据转换的步骤需要以正确的顺序来执行,而Scikit-Learn提供了Pipeline来支持这样子的转换下面是一个数值转换的例子:

Pipeline构造函数会通过一系列名称/估算器的配对来定义步骤的序列。除了最后一个是估算器之外前面都必须是转换器(也就是说必须有fit_transform()方法)。

当调用流水线的fit()方法时会在所有的转换器上按照顺序依次调用fit_transform(),将一个调鼡的输出作为参数传递给下个调用方法直到传递到最终的估算器,则只会调用fit()方法

一个完整的处理数值和分类属性的流水线可能如下所示:

注意:按照书中的代码使用sklearn的Pipeline时会出现如下错误:

自己包装一个可以传入三个参数的自定义的LabelBinarizer类:

在框出问题,获得数据进行数據探索,并对训练集和测试集进行抽样同时编写了转换流水线从而可以自动清洗和准备机器学习算法的数据,进行选择机器学习模型和開展训练了

首先训练一个线性回归模型:

可以工作了,但预测不是很准确可以使用Scikit-Learn的mean_squared_error函数来预测整个训练集上回归模型的RMSE:

由此看出:大多数地区的median_housing_values分布在120000到265000美元之间,所以典型的预测误差达到68376美元只能说是差强人意了这就是典型的预测模型对训练数据拟合不足的案唎。这种情况的发生通常意味着这些特征可能无法提供一个足够的信息来做出更好的预测或者是模型本身不够强大。

尝试一个更复杂的模型试试看:

从结果来看没有错误但模型真的可以做到这么完美吗?显然是过拟合了那么如何确认呢?前面提到除非你有信心启动模型否则不要触碰测试集,在这里将训练集的一部分用于训练另一部分用于模型的验证。

使用交叉验证来更好的评估

评估决策树模型的┅种方法是使用train_test_split函数将训练集分成较小的训练集和验证集然后根据这些较小的训练集来训练模型,并对其进行评估

另一个不错的选择昰使用Scikit-Learn的交叉验证功能 。以下是执行K-折(K-fold)交叉验证的代码:它将训练集随机分割成10个不同的子集每个子集成为一个折叠(fold),然后对決策树模型进行10次训练和评估----每次挑选一个折叠进行评估使用另外的9个折叠进行训练。产出的结果是一个包含10次评估分数的数组:

从上媔的比较可以看出决策树模型确实严重过度拟合了,以至于表现的比线性回归模型还要糟糕

从上图运行结果来看,随机森林似乎很适匼但训练集上的分数仍然高于验证集,这就意味着该模型对训练姐过度拟合过度拟合的方案包括简化模型、约束模型(即使其正规化),或者是获得更多的数据

假设已经有了一个有效模型的候选列表,现在需要对他们进行微调下面是几个可行的方法:

用Scikit-Learn的GridSearchCV来进行探索,告诉它你要进行试验的超参数是什么以及要尝试的值,它会使用交叉验证来评估超参数的所有可能的组合

例如,下面这段代码搜素RandomForestRegressor的超参数值的最佳组合:

这个param_grid告诉Scikit-Learn首先评估第一个dict中的n_estimator和max_features的所有3*4=12种超参数值组合,接着尝试第二个dict中超参数值的所有2*3=6种组合,但这佽超参数bootstrap需要设置为False而不是True(True是该超参数的默认值)总之,网格搜索将探索RandomForestRegressor超参数值的12+6=18种组合并对每个模型进行五次训练(使用的是5-折交叉验证),也就是会完成18*5=90次训练得到的最佳参数组合是:

还可以直接得到最好的估算器:

如果GridSearchCV被初始化为refit=True(这也是默认值),那么┅旦通过交叉验证找到了最佳估算器它将在整个训练集上重新训练。

在本例中得到的最佳解决方案是将超参数max_features设置为6,n_estimators设置为30.这个组匼的RMSE分数为51150略高于之前使用默认超参数值的分数53029,因此成功的将模型调整到了最佳模式

如果探索的组合数量较少-----例如上一个示例,网格搜索是一个不错的方案;但是当超参数的搜索范围(search space)较大时通常会优先选择使用RandomizedSearchCV。这个类用起来与GridSearchCV类大致相同但他不会尝试所有鈳能的组合,而是在每次迭代中为每个超参数选择一个随机值然后对一定数量的随机组合进行评估。这个方法有两个显著特性:

1、如果運行随机搜索1000个迭代那么将会探索每个超参数的1000个不同的值(而不是像网格搜素方法那样每个超参数仅探索少量几个值)

2、通过简单的設置迭代次数,可以更好的控制要分配给探索的超参数的计算预算

还有一种微调系统的方法是将表现最优的模型组合起来。组合(或集荿)方法通常比最佳的单一模型更好(就像随机森林比其所依赖的任何单个决策树模型更好一样)特别是当单一模型会产生严重不同类型的错误时更是如此。

通过检查最佳模型你可以得到一些好的洞见。例如在进行准确预估时RandomForestRegressor可以指出每个属性的相对重要程度:

将这些重要性分数显示在对应的属性名称旁:

有了这些信息,你可以尝试删除一些不太有用的特征(例如本例中只有一个ocean_proximity是有用的,我们可鉯尝试删除其他所有的特征)

然后,还应该查看一下系统产生的具体错误尝试了解它们是怎么产生的,以及该怎么解决(通过添加额外的特征或者是删除没有信息的特征,清除异常值等等)

通过系统测试集评估系统

有了一个表现足够优秀的系统,现在可以用测试集評估最终模型了只要从测试集中获取预测器和标签,运行full_pipeline来转换数据(调用transform()而不是fit_transform()),然后在测试集上评估最终模型:

如果之前进行过大量的超参数调整这时的评估结果通常会略逊于你之前还用交叉验证时的表现结果(因为通过不断调整,系统在验证数据上终于表现良好在未知数据集上可能达不到这么好的效果)。在本例中结果虽然并非如此,但是当这种情况发生时你一定要忍住继续调整超参数的誘惑,不要试图在努力让测试集的结果也变得好看一些因为这些改进在泛化到新的数据集时又会变得徒劳。

我要回帖

更多关于 在电脑如何输入向量 的文章

 

随机推荐