新聞中心
C語言編程出現(xiàn)錯誤,'main' : not in formal parameter list
第二行應該是#includecmath
創(chuàng)新互聯(lián)公司專注于內(nèi)江網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供內(nèi)江營銷型網(wǎng)站建設,內(nèi)江網(wǎng)站制作、內(nèi)江網(wǎng)頁設計、內(nèi)江網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務,打造內(nèi)江網(wǎng)絡公司原創(chuàng)品牌,更為您提供內(nèi)江網(wǎng)站排名全網(wǎng)營銷落地服務。
然后void main 后面應該是加(),而不是 ;
因為這個錯誤是指“main函數(shù)未在正式的參數(shù)列表”
你重新調(diào)試一下吧,希望能幫到你
遞歸特征消除(RFE)+ 交叉驗證
遞歸特征消除(Recursive feature elimination)
遞歸特征消除的主要思想是反復構建模型,然后選出最好的(或者最差的)特征(根據(jù)系數(shù)來選),把選出來的特征放到一邊,然后在剩余的特征上重復這個過程,直到遍歷了所有的特征。在這個過程中被消除的次序就是特征的排序。
RFE的穩(wěn)定性很大程度上取決于迭代時,底層用的哪種模型。比如RFE采用的是普通的回歸(LR),沒有經(jīng)過正則化的回歸是不穩(wěn)定的,那么RFE就是不穩(wěn)定的。假如采用的是Lasso/Ridge,正則化的回歸是穩(wěn)定的,那么RFE就是穩(wěn)定的。
from sklearn.feature_selection import RFE
from sklearn.feature_selection import RFECV
from sklearn.linear_model import LinearRegression,Ridge,Lasso
from pandas import read_csv
import numpy as np
from scipy.stats import pearsonr
from sklearn.model_selection import StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
import csv
tps = read_csv('E:\workfile\data\trade\tps.csv', header=0)
label = np.array(tps)[:, 0]
feature = np.array(tps)[:, 1:]
def RFErfe():
看一下RFE的輸入?yún)?shù):
estimator:估計函數(shù),底層的回歸模型。一個監(jiān)督學習的估計函數(shù),有fit方法,fit方法,通過 coef_ 屬性或者 feature_importances_ 屬性來提供feature重要性的信息。
n_features_to_select : int or None (default=None)選擇(最優(yōu))feature的數(shù)量,超出的部分按照關聯(lián)性排序。如果選擇 None , 就選擇一半的feature。
step:int or float, 可選(default=1)如果大于等于1,step對應于迭代過程中每次移除的屬性的數(shù)量(integer)。如果是(0.0,1.0),就對應于每次移除的特征的比例,四舍五入。
可以調(diào)用的屬性:
n_features_ : int所選特征的數(shù)量。
這是n_features_to_select=2時候的運行結果,可以看出來,兩個部分的屬性應該是最好的,超過的部分按照屬性相關的強弱一次排序。
support_ : array of shape [n_features],[n_features]大小的array,所選特征的一種模糊的表示,可以看出來,打印結果就是true和false,最優(yōu)的是true,別的是false。
ranking_ : array of shape [n_features],[n_features]大小的array,特征的排序,比如 ranking_[i] 表示的就是第i個特征的排名位置。估計最佳的屬性被排為1.
tps = read_csv('E:\workfile\data\trade\tps.csv', header=0)
label = np.array(tps)[:, 0]
feature = np.array(tps)[:, 1:]
這是運行結果。
按照慣例跟進去看一下源碼。
傳入?yún)?shù):
estimator:和上面的一樣。
step:和上面的一樣。
cv:int,交叉驗證的生成器或者迭代器??蛇x。
cv可選擇的輸入為:
-None,使用默認的3折交叉驗證。
-integer,指定交叉驗證的折數(shù)。
-一個object用作交叉驗證的生成器。
-一種迭代的訓練/測試集的分割。
對于None或者integer的輸入。如果“y”是二分類或者多分類,就要用
class: sklearn.model_selection.StratifiedKFold
如果估計函數(shù)是一個分類器,或者“y”不是二分類也不是多分類,就要用
class: sklearn.model_selection.KFold
這里可以使用多種交叉驗證的方法。
我這里使用的是回歸的數(shù)據(jù),因此可以知道使用的是KFold。
跟進去看一下KFold的源碼。
n_splits : int, default=3,交叉驗證的折數(shù),默認3,最少是2。
shuffle : boolean, optional,可選。是否在分割成若干批次之前對數(shù)據(jù)進行洗牌。
random_state : int, RandomState 實例,或者None, optional, 可選default=None默認None。
如果是int, random_state是隨機數(shù)生成器的種子。(指定一個,不指定的話每次結果都會不一樣)
如果是RandomState 實例, random_state是隨機數(shù)生成器。
如果是None,隨機數(shù)是通過 RandomState 實例 np.random 生成的。此時 shuffle == True.
scoring : string, callable(可調(diào)用的) or None, optional,可選的 default: None,默認:None,評分標準。一個string型(參考model evaluation documentation模型評估文檔)或者一個可以調(diào)用的評分object/function
with signature scorer(estimator, X, y) .
可調(diào)用的屬性:
n_features_ : int,通過交叉驗證得到的特征選擇的數(shù)量。
support_:和上面一樣。
ranking_:和上面一樣。
grid_scores_:array of shape [n_subsets_of_features],交叉驗證的分數(shù),比如 grid_scores_[i] 第i個特征子集的CV分數(shù)。 grid_scores_ is equal to ceil((n_features - 1) / step) + 1,
estimator_ :和上面一樣。
誰動了我的VS
誰動了我的特征1為什么要記錄特征轉換行為?使用機器學習算法和模型進行數(shù)據(jù)挖掘,有時難免事與愿違:我們依仗對業(yè)務的理解,對數(shù)據(jù)的分析,以及工作經(jīng)驗提出了一些特征,但是在模型訓練完成后,某些特征可能“身微言輕”——我們認為相關性高的特征并不重要,這時我們便要反思這樣的特征提出是否合理;某些特征甚至“南轅北轍”——我們認為正相關的特征結果變成了負相關,造成這種情況很有可能是抽樣與整體不相符,模型過于復雜,導致了過擬合。然而,我們怎么判斷先前的假設和最后的結果之間的差異呢?線性模型通常有含有屬性coef_,當系數(shù)值大于0時為正相關,當系數(shù)值小于0時為負相關;另外一些模型含有屬性feature_importances_,顧名思義,表示特征的重要性。根據(jù)以上兩個屬性,便可以與先前假設中的特征的相關性(或重要性)進行對比了。但是,理想是豐滿的,現(xiàn)實是骨感的。經(jīng)過復雜的特征轉換之后,特征矩陣X已不再是原來的樣子:啞變量使特征變多了,特征選擇使特征變少了,降維使特征映射到另一個維度中。累覺不愛了嗎?如果,我們能夠?qū)⒆詈蟮奶卣髋c原特征對應起來,那么分析特征的系數(shù)和重要性又有了意義了。所以,在訓練過程(或者轉換過程)中,記錄下所有特征轉換行為是一個有意義的工作??上?,sklearn暫時并沒有提供這樣的功能。在這篇博文中,我們嘗試對一些常見的轉換功能進行行為記錄,讀者可以在此基礎進行進一步的拓展。2有哪些特征轉換的方式?《使用sklearn做單機特征工程》一文概括了若干常見的轉換功能:類名功能說明StandardScaler數(shù)據(jù)預處理(無量綱化)標準化,基于特征矩陣的列,將特征值轉換至服從標準正態(tài)分布MinMaxScaler數(shù)據(jù)預處理(無量綱化)區(qū)間縮放,基于最大最小值,將特征值轉換到[0,1]區(qū)間上Normalizer數(shù)據(jù)預處理(歸一化)基于特征矩陣的行,將樣本向量轉換為“單位向量”Binarizer數(shù)據(jù)預處理(二值化)基于給定閾值,將定量特征按閾值劃分OneHotEncoder數(shù)據(jù)預處理(啞編碼)將定性數(shù)據(jù)編碼為定量數(shù)據(jù)Imputer數(shù)據(jù)預處理(缺失值計算)計算缺失值,缺失值可填充為均值等PolynomialFeatures數(shù)據(jù)預處理(多項式數(shù)據(jù)轉換)多項式數(shù)據(jù)轉換FunctionTransformer數(shù)據(jù)預處理(自定義單元數(shù)據(jù)轉換)使用單變元的函數(shù)來轉換數(shù)據(jù)VarianceThreshold特征選擇(Filter)方差選擇法SelectKBest特征選擇(Filter)可選關聯(lián)系數(shù)、卡方校驗、最大信息系數(shù)作為得分計算的方法RFE特征選擇(Wrapper)遞歸地訓練基模型,將權值系數(shù)較小的特征從特征集合中消除SelectFromModel特征選擇(Embedded)訓練基模型,選擇權值系數(shù)較高的特征PCA降維(無監(jiān)督)主成分分析法LDA降維(有監(jiān)督)線性判別分析法按照特征數(shù)量是否發(fā)生變化,這些轉換類可分為:無變化:StandardScaler,MinMaxScaler,Normalizer,Binarizer,Imputer,F(xiàn)unctionTransformer*有變化:OneHotEncoder,PolynomialFeatures,VarianceThreshold,SelectKBest,RFE,SelectFromModel,PCA,LDAFunctionTransformer*:自定義的轉換函數(shù)通常不會使特征數(shù)量發(fā)生變化對于不造成特征數(shù)量變化的轉換類,我們只需要保持特征不變即可。在此,我們主要研究那些有變化的轉換類,其他轉換類都默認為無變化。按照映射的形式,可將以上有變化的轉換類可分為:一對一:VarianceThreshold,SelectKBest,RFE,SelectFromModel一對多:OneHotEncoder多對多:PolynomialFeatures,PCA,LDA原特征與新特征為一對一映射通常發(fā)生在特征選擇時,若原特征被選擇則直接變成新特征,否則拋棄。啞編碼為典型的一對多映射,需要啞編碼的原特征將會轉換為多個新特征。多對多的映射中PolynomialFeatures并不要求每一個新特征都與原特征建立映射關系,例如階為2的多項式轉換,第一個新特征只由第一個原特征生成(平方)。降維的本質(zhì)在于將原特征矩陣X映射到維度更低的空間中,使用的技術通常是矩陣乘法,所以它既要求每一個原特征映射到所有新特征,同時也要求每一個新特征被所有原特征映射。3特征轉換的組合在《使用sklearn優(yōu)雅地進行數(shù)據(jù)挖掘》一文中,我們看到一個基本的數(shù)據(jù)挖掘場景:特征轉換行為通常是流水線型和并行型結合的。所以,我們考慮重新設計流水線處理類Pipeline和并行處理類FeatureUnion,使其能夠根據(jù)不同的特征轉換類,記錄下轉換行為“日志”?!叭罩尽钡谋硎拘问揭彩侵匾?,由上圖可知,集成后的特征轉換過程呈現(xiàn)無環(huán)網(wǎng)狀,故使用網(wǎng)絡來描述“日志”是合適的。在網(wǎng)絡中,節(jié)點表示特征,有向連線表示特征轉換。為此,我們新增兩個類型Feature和Transfrom來構造網(wǎng)絡結構,F(xiàn)eature類型表示網(wǎng)絡中的節(jié)點,Transform表示網(wǎng)絡中的有向邊。python的networkx庫可以很好地表述網(wǎng)絡和操作網(wǎng)絡,我這是要重新造輪子嗎?其實并不是,現(xiàn)在考慮代表新特征的節(jié)點怎么命名的問題,顯然,不能與網(wǎng)絡中任意節(jié)點同名,否則會發(fā)生混淆。然而,由于sklearn的訓練過程存在并行過程(線程),直接使用network來構造網(wǎng)絡的話,將難以處理節(jié)點重復命名的問題。所以,我才新增兩個新的類型來描述網(wǎng)絡結構,這時網(wǎng)絡中的節(jié)點名是可以重復的。最后,對這網(wǎng)絡進行廣度遍歷,生成基于networkx庫的網(wǎng)絡,因為這個過程是串行的,故可以使用“當前節(jié)點數(shù)”作為新增節(jié)點的序號了。
vlookup函數(shù)rfe怎么回事
VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])
VLOOKUP 函數(shù)語法具有下列參數(shù) (參數(shù):為操作、事件、方法、屬性、函數(shù)或過程提供信息的值。):
lookup_value 必需。要在表格或區(qū)域的第一列中搜索的值。lookup_value 參數(shù)可以是值或引用。如果為 lookup_value
參數(shù)提供的值小于 table_array 參數(shù)第一列中的最小值,則 VLOOKUP
將返回錯誤值 #N/A。
table_array 必需。包含數(shù)據(jù)的單元格區(qū)域??梢允褂脤^(qū)域(例如,A2:D8)或區(qū)域名稱的引用。table_array 第一列中的值是由 lookup_value 搜索的值。這些值可以是文本、數(shù)字或邏輯值。文本不區(qū)分大小寫。
col_index_num 必需。table_array
參數(shù)中必須返回的匹配值的列號。col_index_num 參數(shù)為 1 時,返回 table_array 第一列中的值;col_index_num 為 2 時,返回 table_array 第二列中的值,依此類推。
如果 col_index_num 參數(shù):
小于 1,則 VLOOKUP 返回錯誤值 #VALUE!。
大于 table_array 的列數(shù),則 VLOOKUP 返回錯誤值
#REF!。
range_lookup 可選。一個邏輯值,指定希望 VLOOKUP 查找精確匹配值還是近似匹配值:
如果 range_lookup 為 TRUE
或被省略,則返回精確匹配值或近似匹配值。如果找不到精確匹配值,則返回小于 lookup_value 的最大值。
要點 如果 range_lookup 為 TRUE
或被省略,則必須按升序排列 table_array 第一列中的值;否則,VLOOKUP 可能無法返回正確的值。
有關詳細信息,請參閱對區(qū)域或表中的數(shù)據(jù)進行排序。
如果 range_lookup 為 FALSE,則不需要對 table_array 第一列中的值進行排序。
如果 range_lookup 參數(shù)為 FALSE,VLOOKUP
將只查找精確匹配值。如果 table_array 的第一列中有兩個或更多值與 lookup_value 匹配,則使用第一個找到的值。如果找不到精確匹配值,則返回錯誤值
#N/A。
注解
在 table_array 的第一列中搜索文本值時,請確保 table_array 第一列中的數(shù)據(jù)不包含前導空格、尾部空格、非打印字符或者未使用不一致的直引號(' 或 ")與彎引號(‘ 或
“)。否則,VLOOKUP 可能返回不正確或意外的值。
有關詳細信息,請參閱 CLEAN 函數(shù)和 TRIM 函數(shù)。
在搜索數(shù)字或日期值時,請確保 table_array 第一列中的數(shù)據(jù)未存儲為文本值。否則,VLOOKUP 可能返回不正確或意外的值。
如果 range_lookup 為 FALSE 且 lookup_value 為文本,則可以在 lookup_value 中使用通配符 - 問號 (?) 和星號
(*)。問號匹配任意單個字符;星號匹配任意字符序列。如果要查找實際的問號或星號,請在字符前鍵入波形符 (~)。
特征工程:特征處理方法
如果不同特征的數(shù)量級不在一個等級,模型就不是碗形,而是長條形,難收斂。如果是邏輯回歸、線性回歸,一定要做幅度調(diào)整,如果用樹模型,就不需要幅度調(diào)整。因為樹模型是對各個特征一個一個做的,幅度差異不影響。
可以把不同特征調(diào)整到[0,1]范圍內(nèi),(x-min)/(max-min),適用于非高斯分布,可以保留數(shù)值大部分信息,但易受到異常值影響。
或者使用standard scaler, ,適用于高斯分布。優(yōu)點是處理后的數(shù)據(jù)更加正態(tài)化,但是缺點是對分布要求嚴格。
樹模型(決策樹、隨機森林、GBDT)不需要做數(shù)值的縮放,線性模型、SVM、神經(jīng)網(wǎng)絡、KNN、PCA降維都是需要做數(shù)值縮放的。
1)加減平均:商品價格高于平均價格多少,用戶在某個品類下消費超過平均用戶多少,用戶連續(xù)登錄天數(shù)超過平均多少。。。
2)分位線:商品屬于售出商品價格的多少分位線處。
3)次序型:排在第幾位
4)比例類:電商中,好/中/差評 比例,你已超過全國百分之多少的同學。
比如年齡,是一個連續(xù)值。如果要通過邏輯回歸來判斷是否要讓座,要同時顧及“尊老”“愛幼”。而激活函數(shù)sigmoid函數(shù)是 ,如果 是正數(shù),函數(shù)是單調(diào)增,年齡越大讓座可能越大,但是小孩子就不讓座了,如果 是負數(shù),函數(shù)單調(diào)減,只能滿足愛幼,不能尊老了。所以,將年齡字段分成[0,6],[7,59],[60,120]三段,變成三個字段,對應就會有三個 來判別,是否應該讓座,就可以同時實現(xiàn)尊老和愛幼。
1)等距切分。pd.cut()
2)等頻切分,按照分位數(shù)切分。pd.qcut()
如果是用邏輯回歸模型,就要做離散化,如果使用樹模型,如決策樹、隨機森林,就不一定要做離散化,因為模型本身會給你做離散化。
口紅色號,衣服尺碼等等
red:---1
blue:---2
yellow:---3
如果用以上的編碼方式,不同顏色之間存在了大小關系,而應該是等價的。
red:--1,0,0
blue:--0,1,0
yellow:--0,0,1
拆分成三列,“是否是red”、"是否是blue"、“是否是yellow”。
操作:pd.get_dummies()
啞變量和one hot其實是一件事,就像奇異果和獼猴桃。
相當于multi-hot,有多個1。
比如,我可以建一個詞庫,一句話里如果含有單詞apple,那就在apple這列打1,含有多少單詞就打多少個1。但是這種方法比較稀疏,詞庫太大了。
改進方法:比如我對于每一個領域都有一個詞表,比如財經(jīng)類詞表,體育類詞表。。。然后有一篇文章,我要對他進行分類,就可以看這篇文章里有多少個詞是財經(jīng)詞表里的,有多少詞是體育詞表里面的。
比如:
性別:[男,女]
愛好:[足球,散步,電視劇]
要用愛好來表達性別
男生中這三個愛好的人數(shù)比例是:[2/3, 1/3, 0]
女生中這三個愛好的人數(shù)比例是:[0, 1/3, 2/3]
把這三列 [“喜歡足球的概率”,“喜歡散步的概率”,“喜歡電視劇的概率”] 加在對應的性別后面,可以作為新的特征。
4.如果類別特征空間太大,超過了幾十個一般就不適用one hot了。比如是中介的ID,可以考慮用Label encoding(直接用1,2,3代替,會產(chǎn)生次序關系,但總好過直接丟棄特征)、Count encoding(出現(xiàn)了多少次就寫多少)、Target encoding(根據(jù)標簽,反過來對特征編碼,使用方法就是上面的histogram,但是會造成標簽泄露,產(chǎn)生過擬合??梢杂媒徊骝炞C的思想,分成5折,用4份的數(shù)據(jù)做編碼,然后用剩下的一份做訓練。)
既可以作為連續(xù)值,也可以作為離散值。
連續(xù)值:持續(xù)時間(瀏覽時長)、間隔時間(上次購買距離現(xiàn)在的時間)
離散值:哪個時間段、周幾 等,離散后,就是類別型的數(shù)據(jù)。但不是說一定要做one-hot編碼,比如時間段,可以離散化為“上班高峰期”和“非高峰期”。而周幾,可以用one-hot,也可以離散為“工作日”和“周末”。
1、詞袋模型:就是指上面的hash技巧,文本數(shù)據(jù)去掉停用詞,剩下的詞組成list,在詞庫中的映射稀疏向量。
2、詞袋模型的問題: 李雷喜歡韓梅梅? VS 韓梅梅喜歡李雷,丟失了順序信息。
解決方案:把詞袋中的詞擴充到n-gram,就是分詞的時候,除了“李雷”、“喜歡”、“韓梅梅”,還要加上“李雷喜歡”、“喜歡韓梅梅”。這叫2-gram。在python里的庫叫CountVectorizer。
3、新的問題:只統(tǒng)計了頻次,但是,出現(xiàn)頻次高的一定是重要的嗎?
解決方案:使用TF-IDF特征。如果t雖然在文檔中出現(xiàn)次數(shù)多,但是在其他文檔中出現(xiàn)的次數(shù)也很多,那么這個詞就不重要。
TF(t)=
IDF(t)=
TF-IDF權重=TF(t)*IDF(t)
4、稀疏--稠密,工具是word2vec,在機器學習中不太好用,在深度學習中用得多。原理比較復雜,先不講。
比如:
1)購物車購買轉化率(用戶維度統(tǒng)計特征)
2)商品熱度(商品維度統(tǒng)計特征)
3)對不同item點擊/收藏/購物車/購買的總計(商品維度統(tǒng)計特征)
4)對不同item點擊/收藏/購物車/購買平均每個user的計數(shù)(用戶維度統(tǒng)計特征)
5)變熱門的品牌/商品(商品維度,差值型)
6)最近1/2/3/7天的行為數(shù)與平均行為數(shù)的比值(用戶維度,比例型)
7)商品在類別中的排序(商品維度,次序型)
8)商品交互的總人數(shù)(商品維度,求和型)
等等。。。
統(tǒng)計值也可以用來發(fā)現(xiàn)一些規(guī)律,比如前一天加購物車的商品很有可能第二天購買;加車N件,只買了一件,剩余的不會買。。。
如:張三電子產(chǎn)品,李四服裝,
增加一列,只有同時出現(xiàn)指定的用戶和品類的時候,才取1。
第一種組合完全是拍腦袋,所以可以結合使用 決策樹模型 (GBDT),用GBDT學習出來的路徑,組合成新的特征。不一定是整條路徑,選取其中的一小段也可以是一個新的特征。例如下圖,“年齡 25 是教師” 就是一個新的特征。
1)冗余,部分特征相關度高,消耗計算性能。
2)噪聲,有些特征對結果有負影響。
前者只踢掉原本特征里,和結果預測關系不大的列。后者是要在低維空間中,盡量保存住高維的信息。
1)評估 單個 特征和結果值之間的相關程度,排序,留下Top相關的特征部分。
2)Pearson相關系數(shù),
3)缺點:沒有考慮到特征之間的關聯(lián)作用,可能把有用的關聯(lián)特征誤踢掉。
python包:SelectKBest(選最重要的K個)、SelectPercentile(選最重要的百分之多少)
看做一個子集搜索問題,篩選各種特征子集,用模型評估效果。
典型的包裹型算法為:遞歸特征刪除算法(recursive feature elimination algorithm)。
做法:
1)先用全量特征跑邏輯回歸模型
2)然后系數(shù)排序(體現(xiàn)相關性),砍掉5-10%的弱特征,觀察準確率/auc的變化。
3)逐步進行,直至準確率/auc出現(xiàn)大的下滑為止。
python包:RFE
L1正則化 + 邏輯回歸LR/ linear SVM
L1正則化的效果,是讓一些不重要的特征的權重系數(shù)變成0。
通常用在 稀疏的高維 數(shù)據(jù)。
分享標題:python中rfe函數(shù) rf調(diào)用python函數(shù)
標題URL:http://fisionsoft.com.cn/article/hejpse.html