nlp——机器学习(2)

今天重复盘了一遍python的学生管理系统的写法,复盘复盘一定要复盘!!

下面是今天学习笔记:

吴恩达机器学习笔记:

梯度下降算法:应用于线性回归,还有其他机器学习的应用上
思路:开始于0,1,不停改变0,1去 减少代价函数J,直到我们找到J的最小值或者局部最小值
反复做一步直到收敛     :=赋值    =判等
需要同时更新0,1,即同步更新

a1 := a1 - b(对a1求导)J(a1)
b:学习速率

梯度下降算法在每次下降的每一步会 越来越小,
即下降幅度越来越小,因为导数越来越小,
越来越接近局部最低点,在局部最低点倒=导数为0

线性回归:用直线模型进行拟合

1.特征工程:特征抽取,特征预处理,特征降维。
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
pandas:数据清晰、数据处理(可以着手进行学习)
sklearrn:特征工程

2.特征抽取/提取:机器学习算法 -- 统计方法 -- 数学公式	
	            文本类型 -- 数值 ?    类型 -- 数值 ?
   特征值化:字典特征提取(特征离散化),文本特征提取,图像特征提取
   sklearn.feature_extraction

3.字典特征提取:类别-->one-hot编码
  sklearn.feature_extraction.DictVectorizer(sparse=True,...)
  DictVectorizer.fit_transform(X):字典或者包含字典的迭代器返回值:返回sparse稀疏矩阵(将非零值按位表示出来,节省内存,提高加载效率)
  DictVectorizer.inverse_transform(X):array数组或者sparse矩阵,返回值:转换之前数据格式 
  DictVectorizer.get_feature_names():返回类别名称
  父类:转换器类
  vector:向量(矢量),一维数组
  matrix:矩阵,二维数组
应用场景:1.数据集中类别特征比较多,将数据集的特征-->字典特征,DictVextorizer转换
                 2.本身拿到的数据集就是字典

4.文本特征提取:
  第一种方法:统计每个样本特征词出现的个数。(中文的话需要进行分词)
  sklearn.feature_extraction.text.CountVectorizer(stop_words=[]):返回词频矩阵 ,stop_words:停用词 ,有停用词表 
  CountVectorizer.fit_transform(X):文本或者包含文本字符串的可迭代对象,返回值:sparse矩阵
  CountVectorizer.inverse_transform(X):array数组或者sparse矩阵,返回值:转换之前数据格
  CountVectorizer.get_feature_names():返回值:单词列表
  
  4.2  中文文本特征提取,自动分词,需要安装jieba库,使用 pip install jieba

关键词:在某一类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少

第二种方法:TfidVectorizer
Tf-idf文本特征提取,衡量一个词的重要程度
tf--词频
idf--逆向文档频率,一个词语普遍重要性的度量 

sklearn.feature_extraction.text.TfidVectorizer(stop_words=None...)


5.特征预处理:sklearn.preprocessing
无量纲化 :归一化/标准化,将不同规格的数据转换为同一规格

归一化:
sklearn.preprocessing.MinMaxScaler(featurea_range=(0,1)...)
MinMaxScalar.fit_transfrom(X)
X:numpy array 格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
异常值:最大值,最小值,这种方法知识和传统精小的数据集


标准化:通过对原始数据进行变化把数据变换到均值为0,标准差(离散程度,集中程度)为1范围内
sklearn.preprocessing.StandardScaler()
处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
StandardScaler.fit_transform(X) 
X:numpy array 格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
应用场景:适合现代嘈杂大数据场景

对于归一化来说,如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。 


特征降维:降低的对象是二维数组,降低的维度是降低特征的个数,得到一组”不相关”主变量的过程。
效果:特征与特征之间不相关
numpy  ndarray 维数:嵌套的层数  0维:标量  1维:向量  2维:矩阵

两种方式:1.特征选择;2.主成分分析

特征选择:filter过滤式:1.方差选择法;2.相关系数:特征与特征之间的相关程度
                 Embeded嵌入式:1.决策树;2.正则化;3.深度学习
sklearn.feature_selection

低方差特征过滤:sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
(将低于threshold的特征删除,默认保留所有非零方差特征,即删除所有样本中具有相同值的特征)

相关系数:皮尔逊相关系数,反应变量之间相关关系密切成都的统计指标,取值范围-1~1
from scipy.stats import pearsonr
特征与特征之间相关性很高:1.选取其中一个;2.加权求和;3.主成分分析

这是今天的实例代码:

用到了两个数据集:http://链接:https://pan.baidu.com/s/1D7vxrWjpvwKVz1x8-7h6uQ 提取码:5ruy

from sklearn.feature_extraction import DictVectorizer


def dict_demo():
    # 字典特征提取
    data = [{'city':'北京','temperature':100},{'city':'汕头','temperature':89},{'city':'上海','temperature':45}]
    # 1.实例化一个转换器类
    transfer = DictVectorizer(sparse=False)  # 返回矩阵,否则是稀疏矩阵
    # 2.调用fit_transform()
    data_new = transfer.fit_transform(data)
    print('data_new:\n',data_new)
    print('特征名字\n',transfer.get_feature_names_out())
    return None

if __name__ == '__main__':
    dict_demo()


from sklearn.feature_extraction.text import CountVectorizer


def count_demo():
    # 文本特征抽取
    data = ['Life is short,i like like python','Life is too long,i dislike  python']
    transfer = CountVectorizer()
    data_new = transfer.fit_transform(data)
    print('data_new: \n',data_new.toarray())
    print('特征名字\n',transfer.get_feature_names_out())
    return None
def count_chinese():
    data1 = ['我 爱 北京 天安门','天安门 上 太阳 升']  # 中文的话需要分词,不支持单个中文字
    tran = CountVectorizer()
    data2 = tran.fit_transform(data1)
    print('data2:\n',data2.toarray())
    print('特征名字为\n',tran.get_feature_names_out())
    return None


if __name__ == '__main__':
     count_demo()
     count_chinese()

from sklearn.feature_extraction.text import CountVectorizer
import jieba


def count_chinese_demo():
    # 中文文本特征提取,自动分词,需要安装jieba库
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    # 将中文文本进行分词,遍历列表,将分词好的放入新的列表中
    data_new = []
    for i in data:
        data_new.append(cut_words(i))

    transfer = CountVectorizer()  # 这里可以加入stop_words = []
    data_n = transfer.fit_transform(data_new)
    print('data_n:\n',data_n.toarray())
    print('特征名字\n',transfer.get_feature_names_out())
    return None


def cut_words(text):
    # 进行中文分词
    text = ' '.join(list(jieba.cut(text)))
    return text


if __name__ == '__main__':
    count_chinese_demo()

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba


def tfidf_demo():
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_new = []
    for i in data:
        data_new.append(cut_words(i))

    transfer = TfidfVectorizer()  # 这里可以加入stop_words = []
    data_n = transfer.fit_transform(data_new)
    print('data_n:\n', data_n.toarray())
    print('特征名字\n', transfer.get_feature_names_out())
    return None


def cut_words(text):
    # 进行中文分词
    text = ' '.join(list(jieba.cut(text)))
    return text


if __name__ == '__main__':
    tfidf_demo()

# 导入包 pip install pandas
from sklearn.preprocessing import MinMaxScaler,StandardScaler
import pandas as pd


def minmax():
    # 归一化
    # 先获取数据,再示例化为一个转换器类
    data = pd.read_csv('dating.txt')
    data = data.iloc[:, :3]  # 只要前3列
    print('data:\n',data)

    tran = MinMaxScaler(feature_range=[2,3])
    data_new = tran.fit_transform(data)
    print('data_new\n',data_new)

    return None


def stand_demo():
    # 标准化
    data = pd.read_csv('dating.txt')
    data = data.iloc[:, :3]  # 只要前3列
    print('data:\n', data)

    tran = StandardScaler()
    data_new = tran.fit_transform(data)
    print('data_new\n', data_new)


if __name__ == '__main__':
    minmax()
    stand_demo()

import pandas as pd
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr

def variance():
    # 过滤低方差特征
    data = pd.read_csv('factor_returns.csv')
    data = data.iloc[:,1:-2]
    print('data:\n',data)

    tran = VarianceThreshold(threshold=10)
    data_new = tran.fit_transform(data)
    print('data_new:\n',data_new,data_new.shape)

    # 计算某两个变量之间的相关系数
    # 相关系数:(-0.00438932277993629, 0.8327205496564927)
    r1 = pearsonr(data['pe_ratio'],data['pb_ratio'])
    print('相关系数:\n',r1)
    r2 = pearsonr(data['revenue'],data['total_expense'])
    print('revenue和total_expense的相关性',r2)


if __name__ == '__main__':
    variance()

你可能感兴趣的:(python,机器学习)