❶ 狀態信息的預處理方法
狀態信息的預處理方法主要有預沉、混凝、澄清、過濾、軟化、消毒等。
狀態信息,包含多種多樣的屬性,這些屬性描述您的空閑狀態、活動、聯系信息、日程、位置和備注(包括「個人」備注和「外出」備注)。
預處理命令:
ANSI C 標准規定可以在C源程序中加入一些 預處理命令,以改進程序設計環境,提高編程效率,這此預處理偽字元是由ANSI C 統一規定的,但是它不是C語言本身的組成部分,不能直接對它們進行編譯。
C提供的預處理命令功能主要有以下3種:
(1)宏定義。
(2)文件包含。
(3)條件編譯。
分別用宏定義偽命令,文件包含命令,條件編譯命令來實現,為了與一般C語句相區別,這些命令以符號 # 開關。
❷ 數據的預處理包括哪些內容
數據預處理(datapreprocessing)是指在主要的處理以前對數據進行的一些處理。如對大部分地球物理面積性觀測數據在進行轉換或增強處理之前,首先將不規則分布的測網經過插值轉換為規則網的處理,以利於計算機的運算。另外,對於一些剖面測量數據,如地震資料預處理有垂直疊加、重排、加道頭、編輯、重新取樣、多路編輯等。
數據預處理的方法:
1、數據清理
數據清理常式通過填寫缺失的值、光滑雜訊數據、識別或刪除離群點並解決不一致性來「清理」數據。主要是達到如下目標:格式標准化,異常數據清除,錯誤糾正,重復數據的清除。
2、數據集成
數據集成常式將多個數據源中的數據結合起來並 統一存儲,建立數據倉庫的過程實際上就是數據集成。
3、數據變換
通過平滑聚集,數據概化,規范化等方式將數據轉換成適用於數據挖掘的形式。
4、數據歸約
數據挖掘時往往數據量非常大,在少量數據上進行挖掘分析需要很長的時間,數據歸約技術可以用來得到數據集的歸約表示,它小得多,但仍然接近於保持原數據的完整性,並結果與歸約前結果相同或幾乎相同。
❸ 什麼是遙感信息預處理
遙感信息預處理分為輻射預處理和幾何預處理。其中,輻射預處理基本包括的是輻射定標和輻射校正,這方面輻射定標是根據試驗場完成的,輻射校正可以通過ENVI軟體自動完成。而幾何預處理就是所謂的幾何校正,由於衛星在航天中運行,其運行拍攝時,地球也在自轉,所以存在幾何變形。比如說本是一張矩形的圖像,幾何變形變成了梯形,這種圖像是無法進行遙感圖像解譯的,因為其地物變形嚴重,存在大規模的形狀變形,我們也無法進行目視解譯,所以對這種圖像進行幾何校正,一般來說,圖像都需要進行。另外,衛星的高度比較高,穿過大氣的電磁波也被削弱,所以在獲得圖像時,需要對圖像進行大氣處理,去除大氣的影響,以使得圖像的清晰度再現。其實你可以看你的遙感影像,用FLAASH等去除大氣後,影像的信息表現的更好,目視解譯也是更清晰了。望採納。
❹ 預處理是什麼意思
第十一章 預處理概述在前面各章中,已多次使用過以「#」號開頭的預處理命令。如包含命令# include,宏定義命令# define等。在源程序中這些命令都放在函數之外, 而且一般都放在源文件的前面,它們稱為預處理部分。所謂預處理是指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。預處理是C語言的一個重要功能, 它由預處理程序負責完成。當對一個源文件進行編譯時, 系統將自動引用預處理程序對源程序中的預處理部分作處理, 處理完畢自動進入對源程序的編譯。C語言提供了多種預處理功能,如宏定義、文件包含、 條件編譯等。合理地使用預處理功能編寫的程序便於閱讀、修改、 移植和調試,也有利於模塊化程序設計。本章介紹常用的幾種預處理功能。宏定義在C語言源程序中允許用一個標識符來表示一個字元串, 稱為「宏」。被定義為「宏」的標識符稱為「宏名」。在編譯預處理時,對程序中所有出現的「宏名」,都用宏定義中的字元串去代換, 這稱為「宏代換」或「宏展開」。宏定義是由源程序中的宏定義命令完成的。 宏代換是由預處理程序自動完成的。在C語言中,「宏」分為有參數和無參數兩種。 下面分別討論這兩種「宏」的定義和調用。 無參宏定義無參宏的宏名後不帶參數。其定義的一般形式為: #define 標識符 字元串 其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令。「define」為宏定義命令。 「標識符」為所定義的宏名。「字元串」可以是常數、表達式、格式串等。在前面介紹過的符號常量的定義就是一種無參宏定義。 此外,常對程序中反復使用的表達式進行宏定義。例如: # define M (y*y+3*y) 定義M表達式(y*y+3*y)。在編寫源程序時,所有的(y*y+3*y)都可由M代替,而對源程序作編譯時,將先由預處理程序進行宏代換,即用(y*y+3*y)表達式去置換所有的宏名M,然後再進行編譯。#define M (y*y+3*y)main(){int s,y;printf("input a number: ");scanf("%d",&y);s=3*M+4*M+5*M;printf("s=%d\n",s);}上常式序中首先進行宏定義,定義M表達式(y*y+3*y),在s= 3*M+4*M+5* M中作了宏調用。在預處理時經宏展開後該語句變為:s=3*(y*y+3*y)+4(y*y+3*y)+5(y*y+3*y);但要注意的是,在宏定義中表達式(y*y+3*y)兩邊的括弧不能少。否則會發生錯誤。當作以下定義後: #difine M y*y+3*y在宏展開時將得到下述語句: s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y;這相當於; 3y�2+3y+4y�2+3y+5y�2+3y;顯然與原題意要求不符。計算結果當然是錯誤的。 因此在作宏定義時必須十分注意。應保證在宏代換之後不發生錯誤。對於宏定義還要說明以下幾點:1. 宏定義是用宏名來表示一個字元串,在宏展開時又以該字元串取代宏名,這只是一種簡單的代換,字元串中可以含任何字元,可以是常數,也可以是表達式,預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開後的源程序時發現。2. 宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。3. 宏定義必須寫在函數之外,其作用域為宏定義命令起到源程序結 束。如要終止其作用域可使用# undef命令,例如: # define PI 3.14159main(){……}# undef PIPI的作用域f1()....表示PI只在main函數中有效,在f1中無效。4. 宏名在源程序中若用引號括起來,則預處理程序不對其作宏代換。#define OK 100main(){printf("OK");printf("\n");}上例中定義宏名OK表示100,但在printf語句中OK被引號括起來,因此不作宏代換。程序的運行結果為:OK這表示把「OK」當字元串處理。5. 宏定義允許嵌套,在宏定義的字元串中可以使用已經定義的宏名。在宏展開時由預處理程序層層代換。例如: #define PI 3.1415926#define S PI*y*y /* PI是已定義的宏名*/對語句: printf("%f",s);在宏代換後變為: printf("%f",3.1415926*y*y);6. 習慣上宏名用大寫字母表示,以便於與變數區別。但也允許用小寫字母。7. 可用宏定義表示數據類型,使書寫方便。例如: #define STU struct stu在程序中可用STU作變數說明: STU body[5],*p;#define INTEGER int在程序中即可用INTEGER作整型變數說明: INTEGER a,b; 應注意用宏定義表示數據類型和用typedef定義數據說明符的區別。宏定義只是簡單的字元串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換, 而是對類型說明符重新命名。被命名的標識符具有類型定義說明的功能。請看下面的例子: #define PIN1 int*typedef (int*) PIN2;從形式上看這兩者相似, 但在實際使用中卻不相同。下面用PIN1,PIN2說明變數時就可以看出它們的區別: PIN1 a,b;在宏代換後變成 int *a,b;表示a是指向整型的指針變數,而b是整型變數。然而:PIN2 a,b;表示a,b都是指向整型的指針變數。因為PIN2是一個類型說明符。由這個例子可見,宏定義雖然也可表示數據類型, 但畢竟是作字元代換。在使用時要分外小心,以避出錯。8. 對「輸出格式」作宏定義,可以減少書寫麻煩。例9.3 中就採用了這種方法。#define P printf#define D "%d\n"#define F "%f\n"main(){int a=5, c=8, e=11;float b=3.8, d=9.7, f=21.08;P(D F,a,b);P(D F,c,d);P(D F,e,f);}帶參宏定義C語言允許宏帶有參數。在宏定義中的參數稱為形式參數, 在宏調用中的參數稱為實際參數。對帶參數的宏,在調用中,不僅要宏展開, 而且要用實參去代換形參。帶參宏定義的一般形式為: #define 宏名(形參表) 字元串 在字元串中含有各個形參。帶參宏調用的一般形式為: 宏名(實參表);例如:#define M(y) y*y+3*y /*宏定義*/:k=M(5); /*宏調用*/: 在宏調用時,用實參5去代替形參y, 經預處理宏展開後的語句為: k=5*5+3*5#define MAX(a,b) (a>b)?a:bmain(){int x,y,max;printf("input two numbers: ");scanf("%d%d",&x,&y);max=MAX(x,y);printf("max=%d\n",max);}上常式序的第一行進行帶參宏定義,用宏名MAX表示條件表達式(a>b)?a:b,形參a,b均出現在條件表達式中。程序第七行max=MAX(x,y)為宏調用,實參x,y,將代換形參a,b。宏展開後該語句為: max=(x>y)?x:y;用於計算x,y中的大數。對於帶參的宏定義有以下問題需要說明:1. 帶參宏定義中,宏名和形參表之間不能有空格出現。例如把: #define MAX(a,b) (a>b)?a:b寫為: #define MAX (a,b) (a>b)?a:b 將被認為是無參宏定義,宏名MAX代表字元串 (a,b)(a>b)?a:b。宏展開時,宏調用語句: max=MAX(x,y);將變為: max=(a,b)(a>b)?a:b(x,y);這顯然是錯誤的。2. 在帶參宏定義中,形式參數不分配內存單元,因此不必作類型定義。而宏調用中的實參有具體的值。要用它們去代換形參,因此必須作類型說明。這是與函數中的情況不同的。在函數中,形參和實參是兩個不同的量,各有自己的作用域,調用時要把實參值賦予形參,進行「值傳遞」。而在帶參宏中,只是符號代換,不存在值傳遞的問題。3. 在宏定義中的形參是標識符,而宏調用中的實參可以是表達式。#define SQ(y) (y)*(y)main(){int a,sq;printf("input a number: ");scanf("%d",&a);sq=SQ(a+1);printf("sq=%d\n",sq);}上例中第一行為宏定義,形參為y。程序第七行宏調用中實參為a+1,是一個表達式,在宏展開時,用a+1代換y,再用(y)*(y) 代換SQ,得到如下語句: sq=(a+1)*(a+1); 這與函數的調用是不同的, 函數調用時要把實參表達式的值求出來再賦予形參。 而宏代換中對實參表達式不作計算直接地照原樣代換。4. 在宏定義中,字元串內的形參通常要用括弧括起來以避免出錯。 在上例中的宏定義中(y)*(y)表達式的y都用括弧括起來,因此結果是正確的。如果去掉括弧,把程序改為以下形式:#define SQ(y) y*ymain(){int a,sq;printf("input a number: ");scanf("%d",&a);sq=SQ(a+1);printf("sq=%d\n",sq);}運行結果為:input a number:3sq=7 同樣輸入3,但結果卻是不一樣的。問題在哪裡呢? 這是由於代換只作符號代換而不作其它處理而造成的。 宏代換後將得到以下語句: sq=a+1*a+1; 由於a為3故sq的值為7。這顯然與題意相違,因此參數兩邊的括弧是不能少的。即使在參數兩邊加括弧還是不夠的,請看下面程序:#define SQ(y) (y)*(y)main(){int a,sq;printf("input a number: ");scanf("%d",&a);sq=160/SQ(a+1);printf("sq=%d\n",sq);}本程序與前例相比,只把宏調用語句改為: sq=160/SQ(a+1); 運行本程序如輸入值仍為3時,希望結果為10。但實際運行的結果如下:input a number:3sq=160為什麼會得這樣的結果呢?分析宏調用語句,在宏代換之後變為: sq=160/(a+1)*(a+1);a為3時,由於「/」和「*」運算符優先順序和結合性相同, 則先作160/(3+1)得40,再作40*(3+1)最後得160。為了得到正確答案應在宏定義中的整個字元串外加括弧, 程序修改如下#define SQ(y) ((y)*(y))main(){int a,sq;printf("input a number: ");scanf("%d",&a);sq=160/SQ(a+1);printf("sq=%d\n",sq);}以上討論說明,對於宏定義不僅應在參數兩側加括弧, 也應在整個字元串外加括弧。5. 帶參的宏和帶參函數很相似,但有本質上的不同,除上面已談到的各點外,把同一表達式用函數處理與用宏處理兩者的結果有可能是不同的。main(){int i=1;while(i<=5)printf("%d\n",SQ(i++));}SQ(int y){return((y)*(y));}#define SQ(y) ((y)*(y))main(){int i=1;while(i<=5)printf("%d\n",SQ(i++));}在上例中函數名為SQ,形參為Y,函數體表達式為((y)*(y))。在例9.6中宏名為SQ,形參也為y,字元串表達式為(y)*(y))。 兩例是相同的。例9.6的函數調用為SQ(i++),例9.7的宏調用為SQ(i++),實參也是相同的。從輸出結果來看,卻大不相同。分析如下:在例9.6中,函數調用是把實參i值傳給形參y後自增1。 然後輸出函數值。因而要循環5次。輸出1~5的平方值。而在例9.7中宏調用時,只作代換。SQ(i++)被代換為((i++)*(i++))。在第一次循環時,由於i等於1,其計算過程為:表達式中前一個i初值為1,然後i自增1變為2,因此表達式中第2個i初值為2,兩相乘的結果也為2,然後i值再自增1,得3。在第二次循環時,i值已有初值為3,因此表達式中前一個i為3,後一個i為4, 乘積為12,然後i再自增1變為5。進入第三次循環,由於i 值已為5,所以這將是最後一次循環。計算表達式的值為5*6等於30。i值再自增1變為6,不再滿足循環條件,停止循環。從以上分析可以看出函數調用和宏調用二者在形式上相似, 在本質上是完全不同的。6. 宏定義也可用來定義多個語句,在宏調用時,把這些語句又代換到源程序內。看下面的例子。#define SSSV(s1,s2,s3,v) s1=l*w;s2=l*h;s3=w*h;v=w*l*h;main(){int l=3,w=4,h=5,sa,sb,sc,vv;SSSV(sa,sb,sc,vv);printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);}程序第一行為宏定義,用宏名SSSV表示4個賦值語句,4 個形參分別為4個賦值符左部的變數。在宏調用時,把4 個語句展開並用實參代替形參。使計算結果送入實參之中。文件包含文件包含是C預處理程序的另一個重要功能。文件包含命令行的一般形式為: #include"文件名" 在前面我們已多次用此命令包含過庫函數的頭文件。例如:#include"stdio.h"#include"math.h"文件包含命令的功能是把指定的文件插入該命令行位置取代該命令行, 從而把指定的文件和當前的源程序文件連成一個源文件。在程序設計中,文件包含是很有用的。 一個大的程序可以分為多個模塊,由多個程序員分別編程。 有些公用的符號常量或宏定義等可單獨組成一個文件, 在其它文件的開頭用包含命令包含該文件即可使用。這樣,可避免在每個文件開頭都去書寫那些公用量, 從而節省時間,並減少出錯。對文件包含命令還要說明以下幾點:1. 包含命令中的文件名可以用雙引號括起來,也可以用尖括弧括起來。例如以下寫法都是允許的: #include"stdio.h"#include<math.h> 但是這兩種形式是有區別的:使用尖括弧表示在包含文件目錄中去查找(包含目錄是由用戶在設置環境時設置的), 而不在源文件目錄去查找; 使用雙引號則表示首先在當前的源文件目錄中查找,若未找到才到包含目錄中去查找。 用戶編程時可根據自己文件所在的目錄來選擇某一種命令形式。2. 一個include命令只能指定一個被包含文件, 若有多個文件要包含,則需用多個include命令。3. 文件包含允許嵌套,即在一個被包含的文件中又可以包含另一個文件。條件編譯預處理程序提供了條件編譯的功能。 可以按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。 這對於程序的移植和調試是很有用的。 條件編譯有三種形式,下面分別介紹:1. 第一種形式:#ifdef 標識符程序段1#else程序段2#endif它的功能是,如果標識符已被 #define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯。如果沒有程序段2(它為空),本格式中的#else可以沒有, 即可以寫為:#ifdef 標識符程序段 #endif#define NUM okmain(){struct stu{int num;char *name;char sex;float score;} *ps;ps=(struct stu*)malloc(sizeof(struct stu));ps->num=102;ps->name="Zhang ping";ps->sex='M';ps->score=62.5;#ifdef NUMprintf("Number=%d\nScore=%f\n",ps->num,ps->score);#elseprintf("Name=%s\nSex=%c\n",ps->name,ps->sex);#endiffree(ps);}由於在程序的第16行插入了條件編譯預處理命令, 因此要根據NUM是否被定義過來決定編譯那一個printf語句。而在程序的第一行已對NUM作過宏定義,因此應對第一個printf語句作編譯故運行結果是輸出了學號和成績。在程序的第一行宏定義中,定義NUM表示字元串OK,其實也可以為任何字元串,甚至不給出任何字元串,寫為: #define NUM 也具有同樣的意義。 只有取消程序的第一行才會去編譯第二個printf語句。讀者可上機試作。2. 第二種形式:#ifndef 標識符程序段1#else程序段2#endif與第一種形式的區別是將「ifdef」改為「ifndef」。它的功能是,如果標識符未被#define命令定義過則對程序段1進行編譯, 否則對程序段2進行編譯。這與第一種形式的功能正相反。3. 第三種形式:#if 常量表達式程序段1#else程序段2#endif它的功能是,如常量表達式的值為真(非0),則對程序段1 進行編譯,否則對程序段2進行編譯。因此可以使程序在不同條件下,完成不同的功能#define R 1main(){float c,r,s;printf ("input a number: ");scanf("%f",&c);#if Rr=3.14159*c*c;printf("area of round is: %f\n",r);#elses=c*c;printf("area of square is: %f\n",s);#endif}本例中採用了第三種形式的條件編譯。在程序第一行宏定義中,定義R為1,因此在條件編譯時,常量表達式的值為真, 故計算並輸出圓面積。上面介紹的條件編譯當然也可以用條件語句來實現。 但是用條件語句將會對整個源程序進行編譯,生成的目標代碼程序很長,而採用條件編譯,則根據條件只編譯其中的程序段1或程序段2, 生成的目標程序較短。如果條件選擇的程序段很長, 採用條件編譯的方法是十分必要的。❺ 數據預處理包括哪些內容
數據預處理沒有統一的標准,只能說是根據不同類型的分析數據和業務需求,在對數據特性做了充分的理解之後,再選擇相關的數據預處理技術。
通常來說,數據預處理涉及到——
1)數據清理
填寫空缺的值,平滑雜訊數據,識別、刪除孤立點,解決不一致性
2)數據集成
集成多個資料庫、數據立方體或文件
3)數據變換
規范化和聚集
4)數據歸約
得到數據集的壓縮表示,它小得多,但可以得到相同或相近的結果
5)數據離散化
數據歸約的一部分,通過概念分層和數據的離散化來規約數據,對數字型數據特別重要。
❻ 數據預處理的流程是什麼
數據預處理的常用流程為:去除唯一屬性、處理缺失值、屬性編碼、數據標准化正則化、特徵選擇、主成分分析。
去除唯一屬性
唯一屬性通常是一些id屬性,這些屬性並不能刻畫樣本自身的分布規律,所以簡單地刪除這些屬性即可。
處理缺失值
缺失值處理的三種方法:直接使用含有缺失值的特徵;刪除含有缺失值的特徵(該方法在包含缺失值的屬性含有大量缺失值而僅僅包含極少量有效值時是有效的);缺失值補全。
常見的缺失值補全方法:均值插補、同類均值插補、建模預測、高維映射、多重插補、極大似然估計、壓縮感知和矩陣補全。
(1)均值插補
如果樣本屬性的距離是可度量的,則使用該屬性有效值的平均值來插補缺失的值;
如果的距離是不可度量的,則使用該屬性有效值的眾數來插補缺失的值。如果使用眾數插補,出現數據傾斜會造成什麼影響?
(2)同類均值插補
首先將樣本進行分類,然後以該類中樣本的均值來插補缺失值。
(3)建模預測
將缺失的屬性作為預測目標來預測,將數據集按照是否含有特定屬性的缺失值分為兩類,利用現有的機器學習演算法對待預測數據集的缺失值進行預測。
該方法的根本的缺陷是如果其他屬性和缺失屬性無關,則預測的結果毫無意義;但是若預測結果相當准確,則說明這個缺失屬性是沒必要納入數據集中的;一般的情況是介於兩者之間。
(4)高維映射
將屬性映射到高維空間,採用獨熱碼編碼(one-hot)技術。將包含K個離散取值范圍的屬性值擴展為K+1個屬性值,若該屬性值缺失,則擴展後的第K+1個屬性值置為1。
這種做法是最精確的做法,保留了所有的信息,也未添加任何額外信息,若預處理時把所有的變數都這樣處理,會大大增加數據的維度。這樣做的好處是完整保留了原始數據的全部信息、不用考慮缺失值;缺點是計算量大大提升,且只有在樣本量非常大的時候效果才好。
(5)多重插補(MultipleImputation,MI)
多重插補認為待插補的值是隨機的,實踐上通常是估計出待插補的值,再加上不同的雜訊,形成多組可選插補值,根據某種選擇依據,選取最合適的插補值。
(6)壓縮感知和矩陣補全
(7)手動插補
插補處理只是將未知值補以我們的主觀估計值,不一定完全符合客觀事實。在許多情況下,根據對所在領域的理解,手動對缺失值進行插補的效果會更好。
❼ 預處理是什麼 包括哪兩種方法
資料庫基礎分析為什麼要進行預處理數據 收藏
做數據預處理很重要,但是如何做好數據預處理似乎是件更困難的事。。。。。
-----------------------------------------------------------------------------------------------------------------------
當今現實世界的資料庫極易受雜訊、丟失數據和不一致數據的侵擾,因為資料庫太大(常常多達數千兆位元組,甚至更多),並且多半來自多個異構數據源。低質量的數據將導致低質量的挖掘結果。「如何預處理數據提高數據質量,從而提高挖掘結果的質量?如何預處理數據,使得挖掘過程更加有效、更加容易?」
有大量數據預處理技術。數據清理可以用來去掉數據中的雜訊,糾正不一致。數據集成將數據由多個源合並成一致的數據存儲,如數據倉庫。也可以使用數據變換,如規范化。例如,規范化可以提高涉及距離度量的挖掘演算法的准確率和有效性。數據歸約可以通過聚集、刪除冗餘特徵或聚類等方法來減小數據規模。這些技術不是互斥的,可以一起使用。例如,數據清理可能涉及糾正錯誤數據的變換,如將日期欄位變換成共同的格式。這些數據處理技術在挖掘之前使用,可以顯著地提高挖掘模式的總體質量和/或減少實際挖掘所需要的時間。
介紹數據預處理的基本概念,介紹作為數據預處理基礎的描述性數據匯總。描述性數據匯總幫助我們研究數據的一般特徵、識別雜訊或離群點,對成功的數據清理和數據集成很有用。數據預處理的方法組織如下:數據清理、數據集成與變換和數據歸約。概念分層可以用作數據歸約的一種替換形式,其中低層數據(如年齡的原始值)用高層概念(如青年、中年或老年)替換。這種形式的數據歸約,在那裡我們討論使用數據離散化技術,由數值數據自動地產生概念分層。
為什麼要預處理數據
想像你是AllElectronics的經理,負責分析涉及你部門的公司銷售數據。你立即著手進行這項工作,仔細地審查公司的資料庫和數據倉庫,識別並選擇應當包含在分析中的屬性或維,如item, price和units_sold。啊!你注意到許多元組在一些屬性上沒有值。為了進行分析,希望知道每種購進的商品是否作了銷售廣告,但是發現這些信息沒有記錄下來。此外,你的資料庫系統用戶已經報告某些事務記錄中的一些錯誤、不尋常的值和不一致性。換言之,你希望
使用數據挖掘技術分析的數據是不完整的(缺少屬性值或某些感興趣的屬性,或僅包含聚集數據),含雜訊的(包含錯誤或存在偏離期望的離群值),並且是不一致的(例如,用於商品分類的部門編碼存在差異)。歡迎來到現實世界!
存在不完整的、含雜訊的和不一致的數據是現實世界大型的資料庫或數據倉庫的共同特點。不完整數據的出現可能有多種原因。有些感興趣的屬性,如銷售事務數據中顧客的信息,並非總是可用的。其他數據沒有包含在內只是因為輸入時認為是不重要的。相關數據沒有記錄可能是由於理解錯誤,或者因為設備故障。與其他記錄不一致的數據可能已經刪除。此外,記錄歷史或修改的數據可能被忽略。缺失的數據,特別是某些屬性上缺少值的元組可能需要推導出來。
數據含雜訊(具有不正確的屬性值)可能有多種原因。收集數據的設備可能出故障;人或計算機的錯誤可能在數據輸入時出現;數據傳輸中的錯誤也可能出現。這些可能是由於技術的限制,如用於數據傳輸同步的緩沖區大小的限制。不正確的數據也可能是由命名約定或所用的數據代碼不一致,或輸入欄位(如日期)的格式不一致而導致的。重復元組也需要數據清理。
數據清理常式通過填寫缺失的值、光滑雜訊數據、識別或刪除離群點並解決不一致性來「清理」數據。如果用戶認為數據是臟的,則他們不會相信這些數據的挖掘結果。此外,臟數據造成挖掘過程陷入混亂,導致不可靠的輸出。盡管大部分挖掘常式都有一些過程處理不完整或雜訊數據,但它們並非總是魯棒的。相反,它們著重於避免建模函數過分擬合數據。因此,一個有用的預處理步驟是使用一些清理常式處理數據。2.3節討論清理數據的方法。回到你在AllElectronics的任務,假定在分析中包含來自多個數據源的數據。這涉及集成48 多個資料庫、數據立方體或文件,即數據集成。代表同一概念的屬性在不同的資料庫中可能有不同的名字,這將導致不一致性和冗餘。例如,顧客標識屬性在一個資料庫中可能是customer_id,而在另一個中為cust_id。命名的不一致還可能出現在屬性值中。例如,同一個人的名字可能在一個資料庫中登記為「Bill」,在第二個資料庫中登記為「William」,而在第三個資料庫中登記為「B」。此外,你可能會覺察到,有些屬性可能是由其他屬性(例如年收入)導出的。含大量冗餘數據可能降低知識發現過程的性能或使之陷入混亂。顯然,除數據清理之外,在數據集成時必須採取步驟,避免數據冗餘。通常,在為數據倉庫准備數據時,數據清理和集成將作為預處理步驟進行。還可以再次進行數據清理,檢測和刪去可能由集成導致的冗餘。
回到你的數據,假設你決定要使用諸如神經網路、最近鄰分類法或聚類這樣的基於距離的挖掘演算法進行分析。如果待分析的數據已經規范化,即按比例映射到一個特定的區間[0.0,1.0],這些方法能得到更好的結果。例如,你的顧客數據包含年齡和年薪屬性。年薪屬性的取值范圍可能比年齡大得多。這樣,如果屬性未規范化,距離度量對年薪所取的權重一般要超過距離度量對年齡所取的權重。此外,分析得到每個客戶區域的銷售額這樣的聚集信息可能是有用的。這種信息不在你的數據倉庫的任何預計算的數據立方體中。你很快意識到,數據變換操作,如規范化和聚集,是導向挖掘過程成功的預處理過程。
隨著你進一步考慮數據,你想知道「我選擇用於分析的數據集太大了,肯定降低挖掘過程的速度。有沒有辦法壓縮我的數據集而又不損害數據挖掘的結果?」數據歸約得到數據集的簡化表示,它小得多,但能夠產生同樣的(或幾乎同樣的)分析結果。有許多數據歸約策略,包括數據聚集(例如建立數據立方體)、屬性子集選擇(例如通過相關分析去掉不相關的屬性)、維度歸約(例如使用諸如最小長度編碼或小波等編碼方案)和數值歸約(例如使用聚類或參數模型等較小的表示「替換」數據)。使用概念分層泛化也可以「歸約」數據。泛化用較高層的概念替換較低層的概念,例如,對於顧客位置,用region或49 province_or_state替換city。概念分層將概念組織在不同的抽象層。數據離散化是一種數據歸約形式,對於從數值數據自動地產生概念分層是非常有用的。
下圖總結了這里討論的數據預處理步驟。注意,上面的分類不是互斥的。例如,冗餘數據的刪除既是一種數據清理形式,也是一種數據歸約。
概言之,現實世界的數據一般是臟的、不完整的和不一致的。數據預處理技術可以改進神經網路和最近鄰分類法在第6章介紹,聚類在第7章討論。
數據的質量,從而有助於提高其後的挖掘過程的精度和性能。由於高質量的決策必然依賴於高質量的數據,因此數據預處理是知識發現過程的重要步驟。檢測數據異常、盡早地調整數據並歸約待分析的數據,將在決策過程得到高回報。