机器学习中各类算法、代价函数、衡量标准
本文是基于以下的系统环境,学习和测试机器学习中的各类算法:
- Windows 10
- PyCharm
一、机器学习算法
1、无监督学习
1.1 聚类算法
KMeans算法
- 优点:
1)速度快,可并行 - 缺点:
1)最终结果对于初始化中心点敏感
2)需求预先设定聚类个数 - 相关实现包或类:
1)sklearn.cluster.KMeans
二、数据预处理
1. 数据变换
1.1 数据标准化
- 优点:
1)将数据缩放成均值为0,标准差为1的新数据 - 缺点:
1)原始数据应符合高斯分布
2)加入新的数据时,需要重新计算所有的点 - 相关实现包或类:
1)sklearn.preprocessing.StandardScaler
1.2 数据归一化
- 优点:
1)利用特征的最大最小值,将特征的值缩放到[0,1]区间 - 缺点:
1)加入新的数据时,需要重新计算所有的点 - 相关实现包或类:
1)sklearn.preprocessing.MinMaxScaler
2. 特征工程
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性
1.1 缺失值处理
1.2 数据转换
1.3 特征抽取
将非数值型的特征属性转换成数值类型的过程就是特征抽取,让计算机更好的理解数据
1.3.1 字典数据特征抽取
from sklearn.feature_extraction import DictVectorizer
data = [{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}]
model = DictVectorizer(sparse=False)
transform = model.fit_transform(data)
print(model.get_feature_names())
print(transform)
# ['city=上海', 'city=北京', 'city=深圳', 'temperature']
# [[ 0. 1. 0. 100.]
# [ 1. 0. 0. 60.]
# [ 0. 0. 1. 30.]]
1.3.2 文本数据特征抽取
- 文本全部为英文的情况
from sklearn.feature_extraction.text import CountVectorizer
data = ["life is short, like python", "life is too long, dislike python"]
model = CountVectorizer()
transform = model.fit_transform(data)
print(model.get_feature_names())
print(transform.toarray())
# 单个字母不统计
# ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
# [[0 1 1 1 0 1 1 0]
# [1 1 1 0 1 1 0 1]]
- 文本全部为中英文混合的情况
# 对于含有中英文的文本,需要先进行分词
from sklearn.feature_extraction.text import CountVectorizer
import jieba
data1 = "人生苦短,我喜欢python"
data2 = "人生漫长,不用python"
con1 = jieba.cut(data1)
con2 = jieba.cut(data2)
content1 = list(con1)
content2 = list(con2)
c1 = ' '.join(content1)
c2 = ' '.join(content2)
print(c1)
print(c2)
model = CountVectorizer()
cv = model.fit_transform([c1, c2])
print(model.get_feature_names())
print(cv.toarray())
# 人生 苦短 , 我 喜欢 python
# 人生 漫长 , 不用 python
# ['python', '不用', '人生', '喜欢', '漫长', '苦短']
# [[1 0 1 1 0 1]
# [1 1 1 0 1 0]]
- tf-idf提取
tf:term frequency 词的频率
idf:inverse document frequency 逆文档频率 = log(总文档数量 / 该词出现的文档数量)
tf * idf = 重要性程度
# 对于含有中英文的文本,需要先进行分词
from sklearn.feature_extraction.text import CountVectorizer
import jieba
data1 = "人生苦短,我喜欢python"
data2 = "人生漫长,不用python"
con1 = jieba.cut(data1)
con2 = jieba.cut(data2)
content1 = list(con1)
content2 = list(con2)
c1 = ' '.join(content1)
c2 = ' '.join(content2)
print(c1)
print(c2)
model = CountVectorizer()
cv = model.fit_transform([c1, c2])
print(model.get_feature_names())
print(cv.toarray())
# 人生 苦短 , 我 喜欢 python
# 人生 漫长 , 不用 python
# ['python', '不用', '人生', '喜欢', '漫长', '苦短']
# [[0.40993715 0. 0.40993715 0.57615236 0. 0.57615236]
# [0.40993715 0.57615236 0.40993715 0. 0.57615236 0. ]]
2、有监督学习
2.1 随机森林算法
- 优点:
1)能够处理高维度特征数据,并且不用做特征选择
2)训练完成后,能够给出哪些特征比较重要
1)容易做并行化方法,速度比较快
1)可以进行可视化展示,便于分析 - 缺点:
1)最终结果对于初始化中心点敏感
2)需求预先设定聚类个数 - 相关实现包或类:
1)sklearn.cluster.KMeans