- 机器学习基础篇
- 1基础知识点
- 1、特征工程的定义
- 2、数据集
- 1数据集的结构组成:
- 2数据集类型:
- 3、认识scikit-learn包
- 4、数据的特征抽取
- 5、sklearn特征抽取api
- 5.1对字典数据特征抽取
- 5.2对文书数据特征抽取
- 5.3jieba包
- 5.4Tfidvectorizer(stop_word=none) as tf
- 5.4.1CountVectorizer:
- 5.4.2TfidfVectorizer:
- 5.4.3什么是TF-IDF?
- 5.5缺失值的处理
- 6、特征降维
- 6.1特征选择
- 6.1.1训练特征集方法
- 6.2神经网络
利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。简而言之,特征工程就是一个把原始数据转变成特征的过程,这些特征可以很好的描述这些数据,并且利用它们建立的模型在未知数据上的表现性能可以达到最优。
2、数据集 1数据集的结构组成:特征值+目标值。
2数据集类型:- Kaggle 数据。
- UCI 数据:比较专业。每个领域都有。
- scikit-learn:数据量小,方便学习。
前提:需要有numpy,pandas基础包
安装包:pip install Scikit-lrean
导入包:import sklearn
作用:
| 分类 | classfication |
|---|---|
| 回归 | regression |
| 聚类 | clustering |
| 降维 | dimensionality reduction |
| 模型选择 | model selection |
| 特征工程 | preprocessing |
*特征抽取定义:对文本等数据进行特征值化
导入包 from sklearn.feature_extraction.text import CountVectorizer # 实例化CountVectorizer vector = CountVectorizer() # 调用fit_transform输入并转换数据 res = vector.fit_transform(["life is short,i like python","life is too long,i dislike python"]) # 打印结果 print(vector.get_feature_names()) print(res.toarray())5、sklearn特征抽取api
skl.feature_extraction
5.1对字典数据特征抽取skl.feature_extraction.DictVectorizer(sparse=true) as dv
细化:
| 代码 | 用法 | 对象x | 返回值 |
|---|---|---|---|
| dv.fit_trasform(x) | 输入数据转化 | 字典or包含字典的迭代对象 | sparse矩阵 |
| dv.inverse_transform(x) | sparse矩阵、array数组 | 装换之前的数据格式 | |
| dv.get_feature_names() | --------- | 返回类别 | |
| dv.transform(x) | 按照原先的标准转换 |
def dictvec():
"""
字典数据抽取
"""
# 实例化,(sparse=False并转化为array数组)
dict = DictVectorizer(sparse=False)
# 调用fit_transform
# 返回sparse矩阵
data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
print(dict.get_feature_names())
# 返回类别
#out:
print(dict.inverse_transform(data))
print(data)
return None
5.2对文书数据特征抽取
skl.feature_extraction.text.CountVectorizer as cv
| 代码 | x对象 | 返回值 |
|---|---|---|
| cv.fit_transform(x) | 文本or含字符串的可迭代对象 | sparse矩阵 |
| cv.inverse_tansform(x) | array数组orsparse矩阵 | 转化之前的数据格式 |
| cv.get_feature_names() | 包含数据的所有单词列表 |
def countvec():
"""
对文本进行特征值化
:return: None
"""
cv = CountVectorizer()
data = cv.fit_transform(["人生 苦短,我 喜欢 python", "人生漫长,不用 python"])
print(cv.get_feature_names())
print(data.toarray())
return None
5.3jieba包
import jieba
seg_list = jieba.cut("李小福是创新办主任也是云计算方面的专家") # 默认是精确模式
#添加词
#jieba.add_word('石墨烯')
#删除词
#jieba.del_word('自定义词')
print(", ".join(seg_list))
out:李小福/ 是/ 创新/ 办/ 主任/ 也/ 是/ 云/ 计算/ 方面/ 的/ 专家
def cutword():
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 吧列表转换成字符串
#Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。str.join(sequence)
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
return c1, c2, c3
if __name__ == "__main__":
5.4Tfidvectorizer(stop_word=none) as tf
分类机器学习的重要方法
| 代码 | x对象 | 返回值 |
|---|---|---|
| tf.fit_transform(x) | 文本or可迭代对象 | sparse矩阵 |
| tf.inverse_transform(x) | array数组orsparse矩阵 | 转化为之前的数据格式 |
| tf.get_feture_names() | 返回单词列表 |
def tfidfvec():
"""
中文特征值化
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())
return None
#输出
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0. 0. 0.21821789 0. 0. 0.
0.43643578 0. 0. 0. 0. 0.
0.21821789 0. 0.21821789 0. 0. 0.
0. 0.21821789 0.21821789 0. 0.43643578 0.
0.21821789 0. 0.43643578 0.21821789 0. 0.
0. 0.21821789 0.21821789 0. 0. 0. ]
[0. 0. 0. 0.2410822 0. 0.
0. 0.2410822 0.2410822 0.2410822 0. 0.
0. 0. 0. 0. 0. 0.2410822
0.55004769 0. 0. 0. 0. 0.2410822
0. 0. 0. 0. 0.48216441 0.
0. 0. 0. 0. 0.2410822 0.2410822 ]
[0.15698297 0.15698297 0. 0. 0.62793188 0.47094891
0. 0. 0. 0. 0.15698297 0.15698297
0. 0.15698297 0. 0.15698297 0.15698297 0.
0.1193896 0. 0. 0.15698297 0. 0.
0. 0.15698297 0. 0. 0. 0.31396594
0.15698297 0. 0. 0.15698297 0. 0. ]]
def hanzivec():
"""
中文特征值化
:return: None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
cv = CountVectorizer()
data = cv.fit_transform([c1, c2, c3])
print(cv.get_feature_names())
print(data.toarray())
return None
#输出
```
['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
[0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
[1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]
```
5.4.1CountVectorizer:
把一个文档转成一个包含词频的矩阵。最后的词频矩阵是用csr_matrix这种稀疏矩阵的表示方式来表示的。
5.4.2TfidfVectorizer:TfidfVectorizer返回的是tfidf值
5.4.3什么是TF-IDF?TF-IDF(term frequency-inverse document frequency)词频-逆向文件频率。在处理文本时,如何将文字转化为模型可以处理的向量呢?TF-IDF就是这个问题的解决方案之一。字词的重要性与其在文本中出现的频率成正比(TF),与其在语料库中出现的频率成反比(IDF)。
TF为某个词在文章中出现的总次数。TF = 某个词出现的总次数/总词数。
IDF为逆文档频率。逆文档频率(IDF) = log(词料库的文档总数/包含该词的文档数+1)。
为了避免分母为0,所以在分母上加1。
TF-IDF值 = TF * IDF。
TfidfVectorizer跟CountVectorizer的区别:
CountVectorizer返回的是词频,
TfidfVectorizer返回的是tfidf值
5.5缺失值的处理pandas: pd.dropna
pd,fillna
replace(“?”,np.nan)
6、特征降维 6.1特征选择训练集特征:就是单纯的从提取的所有特征中选择部分特征
- 去掉部分特征相关度比较高的
- 部分特征会对预测结果产生影响
- 可以改变值可以不改
-
filter过滤式:variancethreshold(threshould=none);threshould方差,把小于方差的维度数据删除
-
嵌入式:正则化,决策树
-
包裹式
def var():
"""
特征选择-删除低方差的特征
:return: None
"""
var = VarianceThreshold(threshold=0.7)
data = var.fit_transform([[0, 3, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)
return None
#out: [[3 0]
[1 4]
[1 1]]
PCA:主成分分析。对于一些数据特征存在相关性,且数据特征特别多时,降低数据维度,数据改变,特征数量减少
PCA(n_components=none) #component:小数0-1(90-95%)
pca.fit_transform(x)
- x:np.array数据[n_samplrs,n_features]
- 返回值:转换后的指定维度array
交叉表:pd.crosstab(mt[‘user_id’],mt[aisle’])



