我Python和机器学习都完全零基础,但是teacher让我4周内学完300多页的《机器学习之路》,而且还要看懂代码,我感觉我学者好痛苦,好难受,请问有什么好的建议吗
这种Tea巧都是这样,他们自己都搞不清楚Tea吃的是什么。你该怎么学怎么学。4周肯定学不完的。另外就是Tea巧不是让你学么?你不懂你就盯着他问。他答不上来,那你来不及学的责任就不是你了。
首先你没python基础就难搞,不然线代和高数过关的话,4周学完机器学习还是有可能的,很多都是概念性的东西,公式推导啥的,基本上原理知道,高数和线代熟悉的话,大部分结论都可以自己推导的
另外就是python基础的问题,sklearn库分装好了机器学习的相关模型和代码,如果是你的书附带的源码是用这个实现的话,那没基础你想看懂具体实现过程就比较难,你只能查询知道这个函数接口作用,但是你无法知道怎么实现这个功能的。所以我不知道你们老师说的看懂代码是指只要知道函数接口作用,还是要求你手动实现这些功能。
1、对全书有一个大体的了解,多少页理论,多少实操,最终几个案例?最重要的是什么。
2、跟导师旁敲侧击一下,问问最终读完之后要达到怎么样一个效果(如何验收)
3、在完成以上两步的基础上,制订计划,例如第一周过一遍python基础。。最后一周完成XX。。
这里自己可以考虑的简单一点,但是一定要让导师帮你过目/优化,让导师认可这份计划。
只要导师认可了,你对于最终结果的预期就拆分成了阶段性的目标。
4、阶段性汇报:在执行计划的过程当中,三天/一周一次阶段性汇报,不要占用导师太多时间,
但是得让导师知道你这一周的执行结果。
5、找师兄师姐请教,相信研究方向相同的前辈有更多的经验能帮到你,
也能通过这一步反馈给导师。但是请教的问题别太浅显,师兄师姐:这一届小老弟不大行啊哈哈哈。
6、总结报告。。这最终的PPT就不用多说了吧,准备半个月不过分。
你可以以书的内容章节来分个几节,最后带上自身提升。
也可以将计划进程,完成情况,难点和亮点体现出来
按照学术的一贯X性,高低得引用几篇相关的论文。
注意汇报时机,尽可能在组会上唠个20-30分钟,是一次非常优质的亮肌肉的机会
综上,如果你觉得导师在开玩笑,可能导师最后觉得你在开玩笑。
如果实在觉得自己学不了一点,也请趁早跟导师沟通。越晚越糟
。。所以听起来是不是特别像项目管理的内容?
祝好2333.
(1).判断机器学习算法的性能:
思考这样一个问题,如果所有原始数据都当做训练数据,训练出一个模型,然后用这个模型预测新来的数据所属的类型。训练得到的模型的意义在于在真实环境中使用,但是如果得到的模型很差怎么办?真实的环境难以拿到真实的label(标签)怎么办?以上问题都在告诉我们,其实我们用所有的原始数据都去当训练集来直接训练出模型投入到生产的环境中,这样的做法是不恰当的。
那么如何改进这个问题?改进这个问题的一个最简单的方法被称之为是训练和测试数据集的分离。做法是:只从原始数据中抽出一大部分当做是训练数据,留出来一部分数据作为测试数据。我们只用训练数据来训练出模型,测试数据不参与模型的训练,而是将测试数据丢进模型来让模型预测。由于测试数据本身还包含真实的label值,我们就很容易地看出使用训练数据训练出的模型它的性能是怎样的。也就是说我们可以通过测试数据直接判断模型好坏,如果一旦模型不好,我们在模型进入真实环境前还可以改进模型,直到模型在测试数据中表现出相对好的性能。这样一种方式被称作“train test split”,也就是训练数据集和测试数据集的一个分离。如下图所示:
(2).“train test split”的代码实现:
首先我们需要准备数据集,这次我们使用sklearn提供的鸢尾花的数据集,如下:
我们可以挑选这些数据的20%作为测试数据,通过观察结果标签y,如下:
我们发现,这些鸢尾花的种类是按顺序排列的,所以我们首先需要打乱顺序,再挑选20%作为测试数据。
shuffle_indexes = np.random.permutation(len(X))
形成150个索引的乱序随机排序。
test_ratio = 0.2
test_size = int(len(X) * test_ratio)
设置测试数据所占的比例,这里设置为0.2。然后通过比例,计算出测试数据的大小。
test_indexes = shuffle_indexes[:test_size]
train_indexes = shuffle_indexes[test_size:]
得到测试数据的大小为30,然后将前30个数据设置为测试数据集,将后120个数据设置为训练数据集。
X_train = X[train_indexes]
y_train = y[train_indexes]
X_test = X[test_indexes]
y_test = y[test_indexes]
分别得到测试数据和训练数据的特征矩阵及标签。
(3).封装:
将以上的逻辑封装成一个函数,函数名就叫做“train_test_split”:
import numpy as np
def train_test_split(X, y, test_ratio=0.2, seed=None):
'''将数据 X 和 y 按照test_ratio分割成X_train, X_test, y_train, y_test'''
assert X.shape[0] == y.shape[0], \
"this size of X must be equal to the size of y"
assert 0.0 <= test_ratio <=1.0, \
"test_ratio must be valid"
if seed:
np.random.seed(seed) #由于函数中使用了随机化的过程,有时候我们在debug的时候希望前后两次调用这个函数产生的结果是一致的
#所以我们设置seed这样一个参数,默认为None。如果用户传来具体的数,就作为随机种子。
shuffled_indexes = np.random.permutation(len(X))
test_size = int(len(X) * test_ratio)
test_indexes = shuffled_indexes[:test_size]
train_indexes = shuffled_indexes[test_size:]
X_train = X[train_indexes]
y_train = y[train_indexes]
X_test = X[test_indexes]
y_test = y[test_indexes]
return X_train, X_test, y_train, y_test
(4).使用我们自己封装的算法:
(5).sklearn中的train_test_split:
首先,学习机器学习和Python需要持续的学习和实践,不可能在短时间内突飞猛进。针对当前的情况,建议采用以下方式来快速理解《机器学习之路》中的代码和实现。
将重点放在理解算法原理和核心思想上,而非死记代码。首先理解算法的意义和作用,然后注重理解算法的输入输出和基本实现方法,如果需要编写代码实现算法,可以结合已有的代码进行理解和修改。同时,可以尝试手动计算算法的过程和结果,加深对算法的理解和掌握。
将算法分解成几个部分,逐步学习每个部分的实现。例如,可以首先了解数据的预处理,然后学习特征选择、模型训练和应用等部分。每个部分都有自己的实现方式和技巧,可以注重不同部分的细节,深入理解算法的内容。
练习编写代码,并结合实例进行调试。可以找一些简单的数据集,按照算法的步骤进行学习和实现。代码的编写需要注重细节,例如变量的命名、缩进、注释和错误处理等方面,可以利用工具或开发环境的自动化功能进行调试和排查错误。
针对参考资料中的算法,下面给出代码的解释和实现过程:
根据数据集的格式和读入方式,将数据集转换成列表的形式,每行数据表示一个样本,每列表示一种特征。例如,数据集可以表示成如下形式:
dataSet = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
其中,数据集中的最后一列表示样本的类别,前面的是特征向量。
在决策树算法中,需要确定特征的选择方式。例如,可以采用信息增益或信息增益比等方法进行特征选择,选择结果更好的一个特征作为当前结点的分类依据。在代码实现过程中,可以封装特征选择函数来实现这一步骤。
根据数据集和特征的选择,递归地构建决策树。决策树的每个结点表示一个分类依据,包含分裂特征和子树。代码实现过程中,可以采用字典表示决策树,其中每个键表示一个特征,对应的值可以是分类结果,也可以是另一个字典,表示下一层的子树。
根据决策树预测样本的类别。根据给定的输入,递归地沿着决策树向下遍历,直到叶节点,然后返回叶节点的标签。代码实现过程中,可以编写分类函数,输入参数为决策树、特征名称、样本特征向量,输出为预测结果。
下面是决策树分类函数的实现代码:
def classify(decisionTree, featLabel, testVec):
"""
decisionTree: 构建好的决策树
featLabel: 数据集特征名称列表 ['surfacing', 'flippers']
testVec: 输入的测试向量,例如,想知道 [1, 1] 的类别是什么
"""
firstStr = list(decisionTree.keys())[0]
index_feature = featLabel.index(firstStr)
secondDict = decisionTree[firstStr]
for key in secondDict.keys():
if key == testVec[index_feature]:
if type(secondDict[key]).__name__ == 'dict':
classify_label = classify(secondDict[key], featLabel, testVec)
else:
classify_label = secondDict[key]
return classify_label
在调用该函数时,需要传入决策树、特征名称列表和测试向量,函数的返回值即为分类结果。
# 测试数据
myDat, label = createDataSet()
train_label = label[:]
myTree = createTree(myDat, train_label)
print("分类结果为:%s"%(classify(myTree, label, [1, 0])))
程序输出: 分类结果为:no
测试实例 [1,0 ] 对应的分类结果为no