震惊! “深度学习”都在学习什么

常见的机器学习分类算法

俗话说三个臭皮匠胜过诸葛亮 这里面 集成学习 就是将单一的算法 弱弱结合

算法融合 用投票给特征值加权重 

AdaBoost 集成学习算法

通过迭代训练一系列弱分类器,给予分类错误样本更高权重,使得后续弱分类器更关注这些样本,然后将这些弱分类器线性组合成强分类器,提高整体分类性能。

(一)投票机制

投票是一种直观且常用的算法融合策略。在多分类问题中,假设有多个分类器对同一数据进行分类判断。每个分类器都 “投出” 自己认为正确的类别,最后得票最多的类别就被确定为最终分类结果。比如在一个判断水果种类的任务中,有 5 个分类器,其中 3 个认为图像中的水果是苹果,1 个认为是橙子,1 个认为是香蕉,那么最终结果就是苹果。这种方式简单直接,能快速整合多个模型的意见。

(二)给特征值加权重

给特征值加权重则更为精细和复杂。不同的特征在模型的判断中具有不同的重要性,通过为每个特征分配合适的权重,可以让模型更关注关键特征,从而提升性能。例如在预测房价的模型中,房屋面积、房间数量、地理位置等都是重要特征,但地理位置可能对房价的影响更大。此时,就可以给地理位置特征赋予较高的权重,让模型在学习和预测过程中,对这一特征给予更多的 “关注” 。在实际操作中,确定权重的过程往往借助一些优化算法,通过不断调整权重,使模型在训练数据上的表现达到最优

kN近邻分类

KNN 属于有监督学习算法。其核心思想是:如果一个样本在特征空间中的 k 个最相似(即特征空间中距离最近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

决策树算法

决策树:通过递归分割特征空间构建决策树模型进行分类 。从根节点开始,依据特征测试结果将实例分配到子节点,递归操作直至叶节点,从而完成分类,可处理数值型和标称型数据,常用于客户分类、信用评分等。

随机森林:属于 Bagging 集成学习,对数据集有放回随机采样且随机选择特征,组合多个决策树来提高预测性能,适用于分类和回归任务,尤其是大数据场景

贝叶斯算法

朴素贝叶斯:基于贝叶斯定理,假设特征间相互独立,通过先验概率和条件概率计算分类的概率,选取概率大的情况进行分类。常用于文本分类、垃圾邮件检测等标称型数据处理。

逻辑回归: 基于统计的算法

虽带有 “回归” 二字,但实际是用于二分类任务的线性分类模型,通过 sigmoid 函数将线性组合转为概率,以此进行分类,如垃圾邮件检测、疾病诊断等场景。

支持向量机(SVM)5支持向量机算法

监督式学习方法,核心是构造分割面(超平面)将数据分离,在线性可分时寻找最优分类超平面,可处理数值型和标称型数据,应用于图像分类、文本分类、生物信息学等领域。

分类器

Softmax 分类器是一种常用的多分类算法

sigmoid 分类器是一种常用的二分类算法

 Sigmoid 函数在机器学习中也有广泛应用,特别是在二分类问题中,常与逻辑回归结合使用。

文本分析

1. TF - IDF(Term Frequency - Inverse Document Frequency)

作用

TF - IDF 是一种用于信息检索与文本挖掘的常用加权技术。它衡量一个词在文档中的重要性,综合考虑了词在当前文档中的出现频率(TF)和在整个文档集合中的稀有程度(IDF)。一个词在某个文档中出现频率高,同时在其他文档中出现频率低,那么这个词对该文档的代表性就强,其 TF - IDF 值就高。

转换形式

给定一个文档集合,TF - IDF 会将每个文档转换为一个向量,向量的每个维度对应一个词,向量的值就是该词在文档中的 TF - IDF 值。例如,对于一个包含 1000 个不同词的文档集合,每个文档会被转换为一个 1000 维的向量。

应用场景

  • 信息检索:在搜索引擎中,TF - IDF 可以用来评估查询词与文档的相关性,帮助用户找到最相关的文档。

  • 文本分类:作为特征提取方法,将文本转换为向量后输入到分类模型中,帮助模型区分不同类别的文本。

  • 关键词提取:通过计算每个词的 TF - IDF 值,找出文档中的关键词。

2. Tokenizer

作用

Tokenizer 是一个分词器,主要用于将文本拆分成一个个的词(或标记,token),并将这些词转换为数字表示。在深度学习中,神经网络通常只能处理数字输入,因此需要将文本数据转换为数字序列。Tokenizer 可以构建词汇表,并将每个词映射到一个唯一的整数索引。

转换形式

输入是文本数据,输出是整数序列。例如,输入文本 "This is a test",经过 Tokenizer 处理后可能转换为 [1, 2, 3, 4],其中每个数字对应词汇表中的一个词。

应用场景

  • 深度学习模型输入准备:在训练基于神经网络的文本分类、情感分析、机器翻译等模型时,需要将文本数据转换为模型可以接受的数字序列。

  • 文本预处理:在进行其他 NLP 任务之前,先对文本进行分词和编码,方便后续处理。

3. Word2Vec

作用

Word2Vec 是一种用于学习词向量表示的模型,它可以将每个词映射到一个低维的向量空间中,使得语义相近的词在向量空间中距离较近。通过学习词的上下文信息,Word2Vec 能够捕捉到词之间的语义关系。

转换形式

输入是文本数据,输出是每个词对应的向量。例如,在一个 300 维的词向量空间中,每个词都被表示为一个 300 维的向量。这些向量可以用于表示整个文本,例如将一个句子中的所有词向量相加或求平均得到句子的向量表示。

应用场景

  • 文本相似度计算:通过计算词向量或句子向量之间的相似度,判断文本之间的语义相似度。

  • 文本分类和聚类:将词向量或句子向量作为特征输入到分类或聚类模型中,帮助模型更好地理解文本的语义信息。

  • 机器翻译:在翻译过程中,利用词向量的语义信息提高翻译的准确性。

    
    # 读取数据
    df = pd.read_csv('文件名.csv')
    '''如果数据里面没有列名 加上 header=None'''
    df = pd.read_csv('文件名.tsv', sep='\t')
    '''多文件合并 手动添加标签'''
    df1 = pd.read_csv('文件名1.csv', header=None, sep='\n\t')
    df2 = pd.read_csv('文件名2.csv', header=None, sep='\n\t')
    df3 = pd.read_csv('文件名3.csv', header=None, sep='\n\t')
    df1['label'] = 0
    df2['label'] = 1
    df3['label'] = 2
    
    df = pd.concat([df1, df2, df3])
    
    '''txt '''
    
    df = pd.read_csv('文件名.txt', header=None, sep='\n\t')
    
    # 查看
    df.info()
    
    # 类不平衡处理
    print(df['标签'].value_counts())
    df1 = df[df['标签'] == '类别1'].sample('最少类别数量')
    df2 = df[df['标签'] == '类别2'].sample('最少类别数量')
    df3 = df[df['标签'] == '类别3'].sample('最少类别数量')
    
    df = pd.concat([df1, df2, df3])
    
    '''如果类别不是以数字形式出现的 做标签化'''
    from sklearn.preprocessing import LabelEncoder
    
    y = LabelEncoder().fit_transform(df['标签'])
    
    # 独热
    from tensorflow.keras import utils
    
    y_one = utils.to_categorical(y, 'y的类别数量')
    
    # 文本数据处理
    
    import jieba
    
    x = df['文本']
    x = x.map(lambda s: jieba.lcut(s))
    x = x.map(lambda s: [i for i in s if len(i) > 1])  # >*<  o r z  -.-!!  <b> </b>  <div> </div>
    '''停用词'''
    stopwords = pd.read_csv('停用词库.txt', header=None, sep='\n\t')
    stopwords = ['停用词1', '停用词2', '停用词3', '....']
    x = x.map(lambda s: [i for i in s if i not in stopwords])
    # x = x.map(lambda s:' '.join(s))
    # 文本数据替换
    import re
    
    
    # 定义替换函数--去除标点符号和数字
    def fun(s):
        result = re.sub(f'[^\w\s]', '', str(s))
        result = re.sub(f'[\d]', '', result)
        return result
    
    
    x = x.map(fun)
    
    # 高频词处理
    from collections import Counter
    
    h = ' '.join(x).split()
    count = Counter(h)
    # 词频最高的前十个
    l = count.most_common(10)
    
    x = x.map(lambda s: [i for i in s if i not in l])
    x = x.map(lambda s: ' '.join(s))
    
    # 循环方式处理了词频
    '''
    cout = {}
    for i in x:
        for j in i:
            if count.get(j) == None:
                count[j] = 1
            else:
                count[j] += 1
    h = sorted(count.items(), key=lambda s: s[1])
    print(h)
    stopwords = ['高频词1', '高频词2', '高频词3', '高频词4', '...']
    x = x.map(lambda s: [i for i in s if i not in stopwords])
    x = x.map(lambda s: ' '.join(s))
    '''
    # 绘制词云图
    s = ''
    for i in x:
        s += i + ' '
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    
    wd = WordCloud()
    wd.generate(s)
    plt.imshow(wd)
    plt.show()
    
    # 词性分析
    
    import jieba.posseg as posg
    
    f = ''
    for i in x:
        f += i + ' '
    
    cixing = posg.lcut(f)
    
    print(cixing)
    '''筛选名词'''
    mingci = ''
    for i, j in cixing:
        # ci, cixing = i
        if j == 'n':
            mingci += i + ' '
    
    from gensim.models import Word2Vec
    import logging
    from gensim.models.word2vec import logger, LineSentence
    
    
    # word2vec
    def fun():
        # b.设置输出日志
        logging.basicConfig(level=logging.INFO)
        logger.info('running')
        # b.把语料变成句子集合
        sen = LineSentence('train.txt')
        # c.训练word2vec模型
        model = Word2Vec(sen, vector_size=100)
        # d.保存word2vec模型
        model.save('1.model')
    
    
    with open('train.txt', 'w', encoding='utf8') as f:
        for i in x:
            f.write(i + '\n')
    fun()
    
    # 词转向量
    # 一般用在机器学习
    from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
    
    tfidf = TfidfVectorizer()
    x_tfidf = tfidf.fit_transform(x)
    
    tf = CountVectorizer()
    x_tf = tf.fit_transform(x)
    
    from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score
    
    X_train, X_test, y_train, y_test = train_test_split('x_tfidf 或 x_tf', y)
    
    from sklearn.linear_model import LogisticRegression
    from sklearn.svm import SVC
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.naive_bayes import MultinomialNB
    
    lo = LogisticRegression()
    svc = SVC(probability=True)
    rfc = RandomForestClassifier()
    mnb = MultinomialNB()
    
    gmodel = GridSearchCV('lo/svc/rfc/mnb', param_grid={'C/n_estimators/alpha': []}, cv=5)
    gmodel.fit(X_train, y_train)
    
    lo = LogisticRegression(C=gmodel.best_params_['C'])
    lo.fit(X_train, y_train)
    svc = SVC(C=gmodel.best_params_['C'], probability=True)
    svc.fit(X_train, y_train)
    rfc = RandomForestClassifier(nestimators=gmodel.best_params_['n_estimators'])
    rfc.fit(X_train, y_train)
    mnb = MultinomialNB(alpha=gmodel.best_params_['alpha'])
    mnb.fit(X_train, y_train)
    
    lo.predict(X_test)
    svc.predict(X_test)
    rfc.predict(X_test)
    mnb.predict(X_test)
    
    # 交叉验证
    l = [lo, svc, rfc]
    l1 = []
    for i in l:
        l1.append(cross_val_score(i, X_train, y_train, cv=5).mean())
    plt.bar(['lo', 'svc', 'rfc'], l1)
    plt.show()
    
    # 深度学习进行词转向量
    from tensorflow.keras.preprocessing.text import Tokenizer
    from tensorflow.keras.preprocessing import sequence
    
    token = Tokenizer(4000)
    token.fit_on_texts(x)
    print(token.word_counts)
    print(token.word_index)
    seq = token.texts_to_sequences(x)
    seq_pad = sequence.pad_sequences(seq, maxlen=64)
    
    # 9.构建模型
    # a设置词汇表大小
    input_dim = 4001
    # b设定词嵌入维度
    out_put = 100
    # c设定LSTM层单元数
    lstm = 120
    # d创建序列对象
    from tensorflow.keras import models, layers, losses, optimizers, activations, metrics
    
    model = models.Sequential()
    # e设置嵌入层
    model.add(layers.Embedding(input_dim=input_dim, output_dim=out_put, input_length=64))
    # f定义lstm网络
    model.add(layers.LSTM(lstm))
    # model.add(layers.SimpleRNN(lstm))
    # model.add(layers.GRU(lstm))
    model.add(layers.Dense(units=1, activation=activations.sigmoid))
    '''
    units=1 由标签种类决定,如果二分类问题,y没有独热就写1,独热了就写2
    多分类 有多少类别,就写多少类别,activation=activations.softmax
    '''
    # 全链接 三层全链接
    model.add(layers.Dense(units=100, input_dim=64, activation=activations.relu))
    model.add(layers.Dropout(0.2))  # 随机选择20个神经元不计入当次计算
    model.add(layers.Dense(units=50, activation=activations.relu))
    model.add(layers.Dropout(0.2))
    # print(len(np.unique(y)))
    model.add(layers.Dense(units=1, activation=activations.sigmoid))
    '''
    units=1 由标签种类决定,如果二分类问题,y没有独热就写1,独热了就写2
    多分类 有多少类别,就写多少类别,activation=activations.softmax
    '''
    # 10.模型编译
    model.compile(optimizer=optimizers.Adam(), loss=losses.binary_crossentropy, metrics='acc')
    '''
    二分类:用 binary_crossentrop
    多分类:用 sparse_categorical_crossentropy y没独热的情况下
    '''
    # 12.打印模型结构
    model.summary()
    # 12.训练模型
    model.fit(seq_pad, y, epochs=10, validation_split=0.2, batch_size=10)
    '''
    验证集:
    validation_data:必须传入指定验证集,一般情况会使用测试集进行验证(X_test,y_test)
    validation_split: 将前面传入的数据按照一定比例提取出来当作验证集  0.2 
    
    将数据按批次传入进行训练
    batch_size:将现有数据集切分成一定批次数,按批次传入训练
    
    '''
    # 13.保存模型
    model.save('1.h5')
    
    # 预测
    # 加载预测数据
    '''根据题目要求来'''
    # 分词处理
    s = '''这是一段样本'''
    s = jieba.lcut(s)
    s = [i for i in s if len(i) > 1]
    s = [i for i in s if i not in stopwords]
    
    # 词转向量
    seq = token.texts_to_sequences(x)
    seq_pad = sequence.pad_sequences(seq, maxlen=64)
    
    # 预测
    y_pre = model.predict_classes(seq_pad)
    
    # 保存
    pd.DataFrame(y_pre).to_csv('1.csv')
    
    ['', '', '']
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值