快速入门Python机器学习(35)(下)

简介: 快速入门Python机器学习(35)(下)

2)多项式特征(Polynomial Featur)

ax4+bx3+cx2+dx+e

rnd = np.random.RandomState(50)
x = rnd.uniform(-5,5,size=50)
X = x.reshape(-1,1)
y_no_noise = (np.cos(6*x)+x)
y = (y_no_noise + rnd.normal(size=len(x)))/2
poly = PolynomialFeatures(degree=20,include_bias=False)
X_poly = poly.fit_transform(X)
print(X_poly.shape)


输出


(50, 20)


print("原始数据第一个样本:\n {} ".format(X[0]))
print("多项式处理后第一个样本:\n{} ".format(X_poly[0]))
print("PolynomialFeatures对原始数据的处理:\n{}".format(poly.get_feature_names()))


输出

原始数据第一个样本:
[4.84191851]
多项式处理后第一个样本:
[4.84191851e+00 2.34441748e+01 1.13514784e+02 5.49629333e+02
 2.66126044e+03 1.28856062e+04 6.23910549e+04 3.02092403e+05
 1.46270680e+06 7.08230711e+06 3.42919539e+07 1.66038846e+08
 8.03946561e+08 3.89264373e+09 1.88478637e+10 9.12598202e+10
 4.41872612e+11 2.13951118e+12 1.03593388e+13 5.01590740e+13]
PolynomialFeatures对原始数据的处理:
['x0', 'x0^2', 'x0^3', 'x0^4', 'x0^5', 'x0^6', 'x0^7', 'x0^8', 'x0^9', 'x0^10', 'x0^11', 'x0^12', 'x0^13', 'x0^14', 'x0^15', 'x0^16', 'x0^17', 'x0^18', 'x0^19', 'x0^20']


line = np.linspace(-5,5,1000,endpoint=False).reshape(-1,1)
LNR_poly = LinearRegression().fit(X_poly,y)
line_poly = poly.transform(line)
plt.plot(line,LNR_poly.predict(line_poly),label='Line Regressor')
plt.xlim(np.min(X)-0.5,np.max(X)+0.5)
plt.ylim(np.min(y)-0.5,np.max(y)+0.5)
plt.plot(X,y,"o",c='g')
plt.legend(loc='lower right')
plt.show()

image.png

除了PolynomialFeatures,还有sin()、log()、exp()


14.1.6 自动选择特征

自动选择特征

  • 使用单一变量法(Univariate)
  • 基于模型特征选择(SelectFromModel)
  • 迭代特征选择(RFE)


1使用单一变量法(Univariate) SelectPercentile


class sklearn.feature_selection.SelectPercentile(score_func=, *, percentile=10)[source]


参数

参数

类型

解释

score_func

callable, default=f_classif

函数获取两个数组Xy,并返回一对数组(scorespvalues)或一个带有scores的数组。默认值为f_classif 。默认函数仅适用于分类任务。要保留的功能的百分比

percentile

int, default=10

要保留的功能的百分比


属性

属性

类型

解释

scores_

array-like of shape (n_features,)

多特征。

pvalues_

array-like of shape (n_features,)

特征得分的p值,如果score_func只返回得分,则为无。


方法

fit(X, y)

在(Xy)上运行score函数并获得适当的特性。

fit_transform(X[, y])

适应数据,然后转换它。

get_params([deep])

获取此估计器的参数。

get_support([indices])

获取所选特征的掩码或整数索引。

inverse_transform(X)

反转转换操作。

set_params(**params)

设置此估计器的参数。

transform(X)

X减少到选定的特征。


股票数据预处理

def dealdata(mydata):
    if str(mydata)[-1]=='%':
        try:
            return (float(str(mydata)[:-1])/100)
        except:
            return mydata 
    elif str(mydata)[-1]=='万':
        try:
            return float(str(mydata)[:-1])*10000
        except:
            return mydata
    elif str(mydata)[-1]=='亿':
        try:
            return float(str(mydata)[:-1])*100000000
        except:
            return mydata 
     else:
            return mydata      
def dealcsv():
       stock = pd.read_csv('000002.csv',encoding='GBK')
       new_stock = stock.applymap(dealdata)
       print(new_stock.head())
       new_stock.to_csv('stock.csv',encoding='GBK')
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectPercentile
def stock():
    stock = pd.read_csv('stock.csv',encoding='GBK')
    print(stock.head())



编号

序号

代码

名称

总市值

每股收益

净利润

主营收

0

0

1401

600136

当代文体


3397000000

-3.34

-1.299000e+09

4.110000e+08

1

1

1402

688668

鼎通科技


2212000000

0.88

5.408000e+07

2.700000e+08

2

2

1403

688008

澜起科技


95500000000

0.95

8.780000e+08

1.468000e+09

3

3

1404

603916

苏博特


8651000000

1.30

3.020000e+08

2.451000e+09

4

4

1405

600277

亿利洁能


7395000000

0.13

2.250000e+08

8.683000e+09

[5 rows x 24 columns]


#设置目标
y = stock['涨跌幅']
print(y.shape)
print(y[0])


(408,)
-0.0252


408条数据

'涨跌幅'列第一个数据为:-0.0252

#提取特征值
features = stock.loc[:,'价格':'流通市值']
X = features.values
print(X.shape)
print(X[1])


(408, 15)
[ 2.594e+01 -6.700e-01  0.000e+00  2.661e+01  2.661e+01  2.670e+01
  2.593e+01  6.581e+03  1.721e+07  3.380e-02  9.800e-01  3.226e-01
  2.890e-02  2.950e+01  5.020e+08]


408条数据,提取15个特征项

用神经网络进行处理

mlp = MLPRegressor(random_state=53,hidden_layer_sizes=[100,100,100],alpha=0.1)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=62)
#预处理
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
mlp.fit(X_train_scaled,y_train)
print('训练集得分:{:.2%}'.format(mlp.score(X_train_scaled,y_train)))
print('测试集得分:{:.2%}'.format(mlp.score(X_test_scaled,y_test)))


训练集得分:47.47%
测试集得分:48.47%


random_state,hidden_layer_sizes,alpha根据自身数据,调整到最优解

获取涨幅>=0.05的企业名称

wanted = stock.loc[:,'名称']
print(wanted[y>=-0.05])


0      当代文体
1      鼎通科技
2      澜起科技
3       苏博特
4      亿利洁能
       ... 
362    盟升电子
363    青海春天
364    瀚蓝环境
365     华润微
366    ST亚星
Name: 名称, Length: 367, dtype: object


from sklearn.preprocessing import PolynomialFeatures
select = SelectPercentile(percentile=50)
select.fit(X_train_scaled,y_train)
X_train_selected = select.transform(X_train_scaled)
print('经过缩放后的形态:{}'.format(X_train_scaled.shape))
print('特征选择后的形态:{}'.format(X_train_selected.shape))
15个特征项成为了7个,某些被过滤掉了
mask = select.get_support()
print(mask)
#用图像表示单一变量法特征选择结果
plt.matshow(mask.reshape(1,-1),cmap=plt.cm.cool)
plt.xlabel(u"特征选择")
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.show()


[False False False False False False False True True True True False True True True]

image.png

False (蓝色):过滤掉

True (粉色) :没有过滤掉

#使用特征选择后数据集训练神经网络
X_test_selected = select.transform(X_test_scaled)
mlp_select = MLPRegressor(random_state=53,hidden_layer_sizes=[100,100,100],alpha=0.1)
mlp_select.fit(X_train_selected,y_train)
print('单一变量法特征选择后训练集得分:{:.2%}'.format(mlp_select.score(X_train_selected,y_train)))
print('单一变量法特征选择后测试集得分:{:.2%}'.format(mlp_select.score(X_test_selected,y_test)))


输出


单一变量法特征选择后训练集得分:29.44%
单一变量法特征选择后测试集得分:18.36%


噪音多得分上升,否则下降,所以适合噪音多数据

测试集得分: 48.47% -> 18.36 %


直接处理

univariate

47.47%48.47%

29.44%18.36%


2)基于模型特征选择(SelectFromModel)

class sklearn.feature_selection.SelectFromModel(estimator, *, threshold=None, prefit=False, norm_order=1, max_features=None, importance_getter='auto')


属性

属性

类型

解释

estimator_

an estimator

构建变压器的基估计器。只有当一个非拟合的估计器被传递到SelectFromModel时,即prefitFalse时,才会存储这个值。

threshold_

float

用于特征选择的阈值。


方法

fit(X[, y])

安装SelectFromModel meta-transformer。

fit_transform(X[, y])

适应数据,然后转换它。

get_params([deep])

获取此估计器的参数。

get_support([indices])

获取所选特征的掩码或整数索引。

inverse_transform(X)

反转转换操作。

partial_fit(X[, y])

只安装一次SelectFromModel meta-transformer。

set_params(**params)

设置此估计器的参数。

transform(X)

X减少到选定的特征。


from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestRegressor
Def selectFromModel():
    stock = pd.read_csv('stock.csv',encoding='GBK')
    y = stock['涨跌幅’]
    features = stock.loc[:,'价格':'流通市值’]
    X = features.values
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=62)
    #预处理
    scaler = StandardScaler()
    scaler.fit(X_train)
    X_train_scaled = scaler.transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    sfm = SelectFromModel(estimator=RandomForestRegressor(n_estimators=100,random_state=38),threshold='median')
    sfm.fit(X_train_scaled,y_train)
    X_train_sfm = sfm.transform(X_train_scaled)                    
    print('经过随机森林模型特征选择后的的数据形态:{}'.format(X_train_sfm.shape))
    mask = sfm.get_support()
    print(mask)


输出

经过随机森林模型进行特征后的的数据形态:(306, 8)
[False True False False False False True False False True True False True True True True]


模型选择:

1,随机森林,具有feature_importances_属性

2,L1线性模型,学习稀疏矩阵


image.png


#使用随机森林特征选择后数据集训练神经网络
X_test_sfm = sfm.transform(X_test_scaled)
mlp_sfm = MLPRegressor(random_state=53,hidden_layer_sizes=[100,100,100],alpha=0.1)
mlp_sfm.fit(X_train_sfm,y_train)
print('经过随机森林模型特征选择后训练集得分:{:.2%}'.format(mlp_sfm.score(X_train_sfm,y_train)))
print('经过随机森林模型特征选择后测试集得分:{:.2%}'.format(mlp_sfm.score(X_test_sfm,y_test)))


输出

经过随机森林模型特征选择后的数据形态:(306, 8)
[False True False False False False False True True True True True True True False]
经过随机森林模型特征选择后训练集得分:37.46%
经过随机森林模型特征选择后测试集得分:34.72%


直接处理

univariate

SelectFromModel

47.47%48.47%

29.44%18.36%

37.46%34.72%


3)迭代特征选择(RFE)


class sklearn.feature_selection.RFE(estimator, *, n_features_to_select=None, step=1, verbose=0, importance_getter='auto')


属性

属性

类型

解释

estimator_

Estimator instance

用于选择特征的拟合估计量

n_features_

Int

选定要素的数量

ranking_

ndarray of shape (n_features,)

特征排名,使得ranking_[i]对应于第i特征的排名位置。选定的(即,估计的最佳)特征被分配为秩1

support_

ndarray of shape (n_features,)

选定特征的遮罩


方法

decision_function(X)

计算X的决策函数。

fit(X, y)

RFE模型进行拟合,然后对所选模型进行基础估计。

fit_transform(X[, y])

适应数据,然后转换它。

get_params([deep])

获取此估计器的参数。

get_support([indices])

获取所选特征的掩码或整数索引。

inverse_transform(X)

反转转换操作。

predict(X)

X减少到选定的特征,然后使用。

predict_log_proba(X)

预测X的类对数概率。

predict_proba(X)

预测X的类概率。

score(X, y)

X减少到所选特征,然后返回所选特征的分数。

set_params(**params)

设置此估计器的参数。

transform(X)

X减少到选定的特征。



from sklearn.feature_selection import RFE
def elimination():
    stock = pd.read_csv('stock.csv',encoding='GBK’)
    y = stock['涨跌幅’]
    features = stock.loc[:,'价格':'流通市值’]
    X = features.values
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=62)
    #预处理
    scaler = StandardScaler()
    scaler.fit(X_train)
    X_train_scaled = scaler.transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    rfe = RFE(RandomForestRegressor(n_estimators=100,random_state=38),n_features_to_select=8)
    rfe.fit(X_train_scaled,y_train)
    X_train_rfe = rfe.transform(X_train_scaled)
    print('经过随机森林模型进行迭代特征选择后的的数据形态:{}'.format(X_train_rfe.shape))
mask = rfe.get_support()
    print(mask)
    print(mask)
     #用图像表示特征选择结果
    plt.matshow(mask.reshape(1,-1),cmap=plt.cm.cool)
    plt.xlabel(u"特征选择")
    plt.rcParams['font.sans-serif']=['SimHei’]
    plt.rcParams['axes.unicode_minus']=False
    plt.show()


经过随机森林模型进行迭代特征选择后的数据形态:(306, 8)
[False True False True False False False True False True True True True True False]

image.png

使用随机森林迭代特征选择后数据集训练随机森林

       X_test_rfe = rfe.transform(X_test_scaled)
       mlp_rfe = MLPRegressor(random_state=53,hidden_layer_sizes=[100,100,100],alpha=0.1)
       mlp_rfe.fit(X_train_rfe,y_train)
        print('经过随机森林迭代特征选择后训练集得分:{:.2%}'.format(mlp_rfe.score(X_train_rfe,y_train)))
        print('经过随机森林迭代特征选择后测试集得分:{:.2%}'.format(mlp_rfe.score(X_test_rfe,y_test)))


输出

随机森林迭代特征选择后训练集得分:41.59%
经过随机森林迭代特征选择后测试集得分:43.61%


直接处理

univariate

SelectFromModel

RFE

47.47%48.47%

29.44%18.36%

37.46%34.72%

41.59%43.61%

目录
相关文章
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
Python数据科学实战:从Pandas到机器学习
Python数据科学实战:从Pandas到机器学习
|
1月前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
85 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
47 2
|
1月前
|
机器学习/深度学习 数据可视化 数据处理
掌握Python数据科学基础——从数据处理到机器学习
掌握Python数据科学基础——从数据处理到机器学习
42 0
|
1月前
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
42 0
|
1月前
|
机器学习/深度学习 数据采集 数据挖掘
Python在数据科学中的应用:从数据处理到模型训练
Python在数据科学中的应用:从数据处理到模型训练
|
7月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
251 14
|
7月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
132 1
|
7月前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
7月前
|
机器学习/深度学习 数据采集 算法
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
348 0