机器学习
Posted btxlc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习相关的知识,希望对你有一定的参考价值。
机器学习
特征工程
特征抽取
字典特征抽取
sklearn.feature_extraction.DictVectorizer
类DictVectorizer(sparse=True) 如果sparse=False 则返回列表
.fit_transform(X) X是字典或者包含字典的迭代器 返回sparse矩阵
.inverse_transform(X) X 数组 或者sparse矩阵 返回之前的数据格式
.get_feature_names() 返回类别名称
.transform(X) 按照原先的标准转换
sparse矩阵 节约内存 方便读取处理
vector = DictVectorizer() # 对字典进行特征值化 data = [ {‘city‘:‘北京‘, ‘name‘:123}, {‘city‘:‘上海‘, ‘name‘:1235}, {‘city‘:‘广州‘, ‘name‘:1255}, {‘city‘:‘扬州‘, ‘name‘:15}, ] res = vector.fit_transform(data) print(vector.get_feature_names()) print(res) print(res.toarray())
文本特征抽取
sklearn.feature_extraction.text.CountVectorizer
类DictVectorizer()
.fit_transform(X) X是字符串或者包含字符串的迭代器 返回sparse矩阵
.inverse_transform(X) X 数组 或者sparse矩阵 返回之前的数据格式
.get_feature_names() 返回类别名称
.transform(X) 按照原先的标准转换
cut_word采用了jieba库
def cut_word(string): import jieba c = jieba.cut(string) c_list = list(c) return ‘ ‘.join(c_list) def text_vector(): from sklearn.feature_extraction import text vector = text.CountVectorizer() # 对文本进行特征值化 data = ‘中文特征值,中文真好用,特征值真好用‘ s = cut_word(data) res = vector.fit_transform([s]) print(vector.get_feature_names()) print(res) print(res.toarray())
tf-idf特征抽取
朴素贝叶斯算法 需要用到
term frequency 词频
inverse document frequency
log(总文档数量/该词出现的文档数量)
tf * idf 重要性
sklearn.feature_extraction.text.TfidfVectorizer
返回重要性矩阵
方法和之前的类似.
类TfidfVectorizer(stop_words=None) stop_words为屏蔽的词语列表.
.fit_transform(X) X是字符串或者包含字符串的迭代器 返回sparse矩阵
.inverse_transform(X) X 数组 或者sparse矩阵 返回之前的数据格式
.get_feature_names() 返回类别名称
特征预处理
通过特定的统计方法(数学方法), 将数据转化为算法要求的数据
数值型数据 标准缩放
归一化
标准化
缺失值
sklearn.preprocessing
__all__ = [
‘Binarizer‘,
‘FunctionTransformer‘,
‘Imputer‘,
‘KBinsDiscretizer‘,
‘KernelCenterer‘,
‘LabelBinarizer‘,
‘LabelEncoder‘,
‘MultiLabelBinarizer‘,
‘MinMaxScaler‘,
‘MaxAbsScaler‘,
‘QuantileTransformer‘,
‘Normalizer‘,
‘OneHotEncoder‘,
‘OrdinalEncoder‘,
‘PowerTransformer‘,
‘RobustScaler‘,
‘StandardScaler‘,
‘add_dummy_feature‘,
‘PolynomialFeatures‘,
‘binarize‘,
‘normalize‘,
‘scale‘,
‘robust_scale‘,
‘maxabs_scale‘,
‘minmax_scale‘,
‘label_binarize‘,
‘quantile_transform‘,
‘power_transform‘,
]
归一化:
映射到默认[0,1] 或者通过feature_range设置
mm = MinMaxScaler(feature_range=(3, 5)) #实例化 data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]) print(data)
[[5. 3. 3. 3. ]
[3. 5. 5. 4.66666667]
[4. 4. 4.2 5. ]]
缺点:容易受异常点影响 鲁棒性较差. 传统精确小数据场景
标准化:
均值为0, 方差为1的标准内
std = StandardScaler() data = std.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]) print(data) print(std.mean_)
适合大数据场景, 异常点影响不大
缺失值:
删除或者插补
.Imputer(missing_value=‘NaN‘, strategy=‘mean‘, axis=0) 策略是用mean(平均数) 来填补NaN axis=0时按列填补(特征)
Imputer.fit_transform(X) X 是narray的格式 返回同等规模的
缺失值必须是np.nan 不能是其他字符
数据降维
维度: 特征的数量
1.特征选择
.feature_selection
原因:
1.冗余 相关度高 增加了计算负荷
2.噪声 部分特征对预测结果有影响
主要方法:
Filter 过滤式 VarianceThreshold
.VarianceThreshold(threshold=0.0)
删除方差低于0.0的特征 默认为0
Embedded嵌入式 正则化 决策树
Wrapper 包裹式
神经网络
2.主成分分析
.decomposition
PCA principle Component Analysis
目的:使数据压缩,尽可能降低数据维度,损失少量信息
特征数量达到上百的时候 考虑数据简化问题
数据会改变 特征数量减少
PCA(n_components=None)
0.9-0.95 表示保留90%-95%的信息 是可以不断调的
如果是整数 表示减少到的特征数量 一般不使用
数据
建议
训练集 约75%
测试集 约25%
用训练集来建立模型, 用测试集来评估模型
数据集划分的API:
.model_selection.train_test_split(*arrays. **options)
特征值
目标值
test_size 测试集的大小 25%
random_state 随机数种子
数据集的API :
.datasets
datasets.load_*() 小规模数据集
datasets.fetch_*(data_home=None) 从网上下载的大规模数据
返回的数据是字典类型
data: 特征数据数组 ndarray
target 标签数组
DESCR 数据描述
feature_names 特征名 新闻数据 手写数字 回归数据没有
target_names 标签名
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split li = load_iris() # print(li.data) # print(li.target) # print(li.DESCR) # 顺序固定 x_train, x_test, y_train, y_test = train_test_split(li.data, li.target, test_size=0.25) print(x_train, y_train) # 训练集的特征数据和目标值 print(x_test, y_test) # 测试集的特征数据和目标值
转换器与预估器
之前的处理就是转换器 是实现特征工程的API
fit_transform方法, 先fit() 把数据复制进去 算出平均值标准差等 再transform() 对数据进行转换
预估器 estimator 是实现算法的API
用于分类的预估器
sklearn.neighbor K邻近算法
sklearn.naive_bayes 贝叶斯
sklearn.linear_model.LogisticRegression 逻辑回归
sklearn.tree 决策树与随机森林
用于回归的预估器
sklearn.linear_model.LinearRegression 线性回归
sklearn.linear_model.Ridge 岭回归
用于聚类的预估器....
1.调用fit(x_train,y_train)
2.
predict(x_test)
score(x_test,y_test)
分类算法
K近邻算法
计算距离 找到最近的K个点 大部分是属于哪一类就是哪一类
from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=5) knn.fit(data) predict_ = knn.predict(x_test)
朴素贝叶斯
求出属于每个类别的概率 找出概率最大者
必须 特征独立 ----朴素
C 某一类别
W 特征集
有一定可能最后结果是0, 因为这个词在训练的样本中从未出现过
m为特征值的个数, 即W集的个数
.naive_bayes.MultinomialNB(alpha=1.0)
alpha即为拉普拉斯平滑系数
特点:
分类效率稳定
对缺失数据不太敏感, 算法简单 不需要调参 常用于文本分类
准确率高, 速度快
缺点:
受训练数据影响特别大
特征必须独立存在(朴素)
文本分类而言, 神经网络效果比朴素贝叶斯更好
分类模型的评估
准确率
预测对的占总数据的百分比
召回率
预测正确的占所有正确的数据的百分比
精确率
预测正确的占预测为正确值的百分比
F1-score
分类评估的API
.metrics.classfication_report(y_true, y_predict, target_names=None)
模型选择与调优
交叉验证 不包括测试集 cross validation
求平均值
网格搜索 调参数
每组超参数用交叉验证来评估
API
.model_selection.GridSearchCV(estimator, param_grid=None, cv=None)
estimator 估计其对象
param_grid 给一些值,存放在字典中
cv 用几折交叉验证
然后用fit()输入数据
best_score_:
best_estimator_:
cv_results:
from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.datasets import load_iris from sklearn.model_selection import GridSearchCV knn = KNeighborsClassifier() li = load_iris() x_train, x_test, y_train, y_test = train_test_split(li.data, li.target, test_size=0.25) param = {"n_neighbors": [2, 3, 4, 5, 6, 7, 8, 9, 10]} gc = GridSearchCV(knn, param_grid=param, cv=10) gc.fit(x_train, y_train) print("测试集上的准确率", gc.score(x_test, y_test)) print("交叉验证中最好的结果", gc.best_score_) print("最好的模型", gc.best_estimator_) print("每次交叉验证的结果", gc.cv_results_)
以上是关于机器学习的主要内容,如果未能解决你的问题,请参考以下文章