Neural Networks篇(二),让AI分辨猫和狗并优化
前言今天再来做一个神经网络的分类任务,完整代码见 https://github.com/zong4/AILearning。
代码来看看比上次多了什么。
数据增强首先是考虑到图像比较少,所以通过旋转缩放来生成新的图像供 AI 训练。
123456789101112131415train_image_generator = ImageDataGenerator(rescale=1./255, rotation_range=45, width_shift_range=.15, height_shift_range=.15, horizontal_flip=True, zoom_range= ...
Learning篇(三),让AI推荐书籍
前言今天来写一个图书推荐引擎,完整代码见 https://github.com/zong4/AILearning。
数据处理主要是有三个表,给大家看一下。
先把数据提出来,画图就不画了,数据量有点大,给我电脑干卡了。
12345678910111213141516171819202122232425262728293031books_filename = './book_recommendation/book-crossings/BX-Books.csv'ratings_filename = './book_recommendation/book-crossings/BX-Book-Ratings.csv'users_filename = './book_recommendation/book-crossings/BX-Users.csv'# import csv data into dataframesdf_books = pd.read_csv( books_filename, encoding = &q ...
Neural Networks篇(三),用无监督学习让AI学会画圆
前言之前不是有说过,神经网络可以学会非线性关系,例如圆之类的,今天我们就来尝试一下,目标就是拟合出下面的圆,完整代码见 https://github.com/zong4/AILearning。
无监督学习大家先自己过一下代码。
12345678910111213141516171819202122232425262728293031323334353637# 生成圆上的数据点num_points = 1000theta = np.linspace(0, 2 * np.pi, num_points)radius1 = 1radius2 = 2x1 = radius1 * np.cos(theta)y1 = radius1 * np.sin(theta)x2 = radius2 * np.cos(theta)y2 = radius2 * np.sin(theta)data = np.column_stack((np.concatenate((x1, x2)), np.concatenate((y1, y2))))# 划分训练集和测试集train_size = int(0.8 * num_ ...
Language篇(三),让AI识别垃圾邮件
前言今天是最后一个 Project 了,完整代码见 https://github.com/zong4/AILearning。
词袋模型(Bag-of-Words)之前的文章有提到词袋模型做垃圾邮件分类效果挺好的,所以先用这方法,核心代码如下。
1234567891011# 提取特征vectorizer = CountVectorizer()X_train = vectorizer.fit_transform(train_data['message'])X_test = vectorizer.transform(test_data['message'])y_train = train_data['label']y_test = test_data['label']# 训练模型model = MultinomialNB()model.fit(X_train, y_train)
构建词汇表遍历训练集中的所有邮件文本,统计出现的所有不重复的词汇,这些词汇构成了词汇表(Vocabulary)。
例如,训练集中的邮件 ...
集成学习,改良随机森林算法,预测缺失数据集
前言这个专栏的核心是阅读《机器学习》这本书,同时也会结合 Kaggle 等实战项目,加深对机器学习的理解。
这次是第8章,集成学习,用 Kaggle 的泰坦尼克号生存预测来举例,代码见 https://www.kaggle.com/code/zzoonngk/titanic。
定义集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(multi-classifier system)、基于委员会的学习(committee-based learning)等,一般可以被简化为如下结构。
其中这些个体学习器可以用相同的算法,也可以用不同的算法。
那么集成学习是如何做到比单个学习器更好的呢?来看一组图。
这里默认的结合方法是“少数服从多数”,可以发现只有情况a可以集成提升性能。
基于此,我们可以得出集成个体应该“好而不同“,如果大家不好就可能会是情况c,如果大家都好但是一样就可能会是情况b。
由此引申出了个体学习器的准确性与多样性。
BoostingBoosting 是一种串行集成学习方法,核心思路是不断提高个体学习器的准确性。
...
模型评估与选择,理解AUC和ROC
前言我总是觉得,光看书很难理解知识,因为人们在写书时似乎总是把知识写得很官方,全然不讲那些知识是如何被想出来的。
AUC从咱们的定义上来说,这就是一条真正例率(TPR)和假正例率(FPR)的关系曲线。
至于这条线是怎么画出来的,就是通过不停的调整分类阈值,然后计算出每个阈值下的TPR和FPF。
所以其实在我眼里,y轴也可以被替换为分类阈值。
也就是说这本质上可以理解为一条假正例率关于分类阈值的变化曲线。
所以 AUC 的本质作用就是用来寻找合适的分类阈值。
那自然我们也可以根据我们的实际需要,比如真负例率(TNR)更重要,那么我们就可以画出另一条 ”AUC“(到时候就不叫这个名字了),来帮助我们挑选合适的分类阈值。
ROCROC 呢其实没太多需要解释的,看书就行了。
被包裹了自然就说明另一个模型更好,毕竟假正例率一样的时候,真正例率更高的模型自然更好。
但是要是说面积更大的模型更好,那我就不敢苟同了,毕竟你模型提交上去的时候阈值就定下来了。
决策树,处理缺失值
前言像基本流程,划分选择,剪枝处理,我这边就不讲了,直接看后面的重点。
缺失值处理我之前一直以为决策树是不能处理缺失值的,所以我之前那篇集成学习才会自己实现随机森林的缺失值处理,这次给大家看看能处理缺失值的决策树。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879class DecisionTreeClassifierWithMissing(DecisionTreeClassifier): def _split_node(self, X, y, sample_weight, depth, impurity, n_node_samples, weighted_n_node_samples, feature, threshold): left_indices = [] ri ...